从逗号分隔列表中删除连续重复项(整数 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”。但是接下来我们必须匹配其他所有内容,包括行尾。因此,我使用“不是(数字或点)”代替“不是数字而不是点”。
据我所知,这里没有这样的确切问题。
我是正则表达式的新手,我需要解决以下问题。 假设我有一个这样的(排序的)列表:
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”。但是接下来我们必须匹配其他所有内容,包括行尾。因此,我使用“不是(数字或点)”代替“不是数字而不是点”。