正则表达式从逗号分隔列表中删除连续重复(整数和/或浮点数)
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。
详情:
(?<![^\D,])
- 紧靠当前位置的左侧,除了非数字或逗号之外不能有字符
(\d+(?:\.\d+)?)
- 第 1 组:一位或多位数字后跟可选的 .
序列和一位或多位数字
(?:,\1)+
- 一个或多个逗号序列和第 1 组值
(?![^,]|\.?\d)
- 紧靠右侧,除了,
或可选的.
后跟数字之外,不能有其他字符。
【讨论】:
谢谢,看来修改为(?<![^\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 中的正则表达式从逗号分隔列表中删除重复项,但我不想要重复值? [复制]