正则表达式从逗号分隔列表中删除连续重复(整数和/或浮点数)

Posted

技术标签:

【中文标题】正则表达式从逗号分隔列表中删除连续重复(整数和/或浮点数)【英文标题】:Regex to Delete Consecutive Duplicates (integers and/or floats) from Comma Separated List 【发布时间】:2021-06-24 15:15:30 【问题描述】:

据我所知,这里没有这样的确切问题。

我是正则表达式的新手,我需要解决以下问题。 假设我有一个这样的(排序的)列表:

1,1,1.28,1.35,1.4,1.4,2,2,4,7.5,7.56

哪个是匹配所有重复项的合适正则表达式?

我尝试了不同的选项,到目前为止最好的选项是 ?:^|,)([^,]+)(,[ ]*\1)+,但显然它没有考虑到像 1,1,1.28 这样的情况(请参阅 demo)。

简单来说,我需要它的正则表达式:

Whatever there's inside two commas, match if there is a duplicate

非常感谢您的帮助!

谢谢

【问题讨论】:

欢迎来到***。在您发布自己的代码以显示您自己解决问题的尝试之前,您不太可能收到对您的问题的答复。此外,您应该标记问题以显示您的正则表达式使用哪种语言。 【参考方案1】:

你可以使用

(?<![^\D,])(\d+(?:\.\d+)?)(?:,\1)+(?![^,]|\.?\d)

替换为$1。请参阅regex demo。

详情

(?&lt;![^\D,]) - 紧靠当前位置的左侧,除了非数字或逗号之外不能有字符 (\d+(?:\.\d+)?) - 第 1 组:一位或多位数字后跟可选的 . 序列和一位或多位数字 (?:,\1)+ - 一个或多个逗号序列和第 1 组值 (?![^,]|\.?\d) - 紧靠右侧,除了, 或可选的. 后跟数字之外,不能有其他字符。

【讨论】:

谢谢,看来修改为(?&lt;![^\D,])(\d+(?:\.\d+)?)(?:,\1)+(?![^,\s*]|\.?\d)解决了1.28,1.28,1,1,,1,1.18,1.18的情况。如果在最后一个否定查找中没有 \s*,它不会考虑列表末尾不以逗号结尾的重复项。谢谢!【参考方案2】:

我的看法是:

(\b\d+(?:\.\d+)?\b)(?:,\1)+[^\.\d]

这个特别好的地方是它匹配重复数字之间的所有逗号。如果您只需要在列表中保留一个数字的副本并删除所有其他数字,这很方便 - 您可以简单地删除整个匹配并将其替换为第 1 组内容,并且 逗号顺序仍然是正如预期的那样 - a,b,c 或者,如果您需要完全删除重复项,只需删除所有匹配项(同样,顺序相同)。

解释:

(\b\d+(?:\.\d+)?\b) 匹配一个数字,可能是一个小数。使用“边界”是为了不匹配“...,11,1,...”。不允许使用这种精确的数字顺序 (11>1),但我插入它只是为了确保不会出现类似问题。 (?:,\1)+ 匹配一个逗号,然后是之前找到的数字。在这里,我们使用了数字已排序的事实。 [^\.\d] 很棘手:如果第一个非数学数字有一个点而匹配没有,我们必须停止并且不匹配该点。此外,我们必须不匹配“7.5,7.56”,为此我们可以使用“not digit”。但是我们必须匹配其他所有内容,包括行尾。因此,作为“not digit AND not dot”的替代品,我使用了“not (digit or dot)”。

【讨论】:

谢谢!这似乎也有效,对其他回复的相同评论也适用。没想到会立即获得支持 :) 似乎正则表达式是当今的热门话题

以上是关于正则表达式从逗号分隔列表中删除连续重复(整数和/或浮点数)的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Oracle 中的正则表达式从逗号分隔列表中删除重复项,但我不想要重复值? [复制]

如何通过 Oracle regexp_replace 中的正则表达式从逗号分隔列表中删除重复项? [复制]

正则表达式匹配两个或多个逗号分隔的整数

逗号分隔的列表正则表达式 [重复]

正则表达式捕获逗号分隔值

ruby Amazon ASIN正则表达式和Ruby用于从逗号分隔或换行符分隔的textarea中提取asins