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

Regex to Delete Consecutive Duplicates (integers and/or floats) from Comma Separated List

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

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

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

哪个正则表达式匹配所有重复项?

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

简而言之,我需要的正则表达式:

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

非常感谢您的帮助!

谢谢

您可以使用

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

替换为</code>。见 <a href="https://regex101.com/r/vd8Gad/1" rel="nofollow noreferrer">regex demo</a>.</p> <p><em>详情</em>:</p> <ul> <li><code>(?<![^\D,]) - 紧靠当前位置的左侧,除了非数字或逗号之外不能有其他字符

  • (\d+(?:\.\d+)?) - 第 1 组:一个或多个数字后跟可选的 . 序列和一个或多个数字
  • (?:,)+ - 一个或多个逗号序列和第 1 组值
  • (?![^,]|\.?\d) - 紧靠右边,除了 , 或后跟数字的可选 . 之外不能有其他字符。
  • 我对此的看法是:

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

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

    解释:

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