如果有多个,则匹配所有逗号

Posted

技术标签:

【中文标题】如果有多个,则匹配所有逗号【英文标题】:Match all commas if there's multiple 【发布时间】:2020-12-14 16:39:44 【问题描述】:

我需要从字符串中删除所有非数字字符。因为人们使用不同的千位分隔符——有些人认为为此目的使用逗号非常好,而且一点也不容易与小数点混淆(特别是因为有些国家使用逗号作为小数点),正则表达式变得很烦人。

这是我目前的尝试:

[^\d,.]|[.,](?=.*[.,])|(?<=,.*),
    [^\d,.] 匹配所有不是逗号或点的非数字字符(因为它们还使用 ' 作为分隔符,而不仅仅是点和逗号) [.,](?=.*[.,]) 匹配所有逗号和后面仍跟一个点或逗号的点 (?&lt;=,.*), 匹配所有逗号,如果我们之前看到过逗号,已经

(稍后我可能不得不将(2)分成两种情况,但这不是这个问题的问题。

(3) 的目的是如果字符串包含多个逗号,我们可以安全地假设它用作千位分隔符而不是小数点。

123,456 应解释为 123.456(因此 , 与正则表达式不匹配) 123,456,789 应被解释为 123456789(因此 both 逗号匹配正则表达式)

当然(?&lt;=,.*), 是无效的,因为look-behinds 需要是固定长度,而.* 不是。

如何匹配这些讨厌的逗号?

(目的是最终将正则表达式提供给 Java 字符串替换方法。)

var sanitisedInput = rawInput.replaceAll(<regex>, "")

【问题讨论】:

您如何预测123,456 应该被视为123.456 而不是123456 您是否保证所有十进制数只保留 2 位或更少? @VighneshRaut 我没有。这是我们做出并记录的假设。考虑到某些人使用, 作为小数点,这对我们来说听起来更安全。 @MonkeyZeus 不,我们没有。 Afaik,最多有 6 位小数。 (而且我可能不得不在之后为科学记数法调整正则表达式,但一次一个问题。) 那么123,456.789123.456,789 应该变成什么? 【参考方案1】:

下面的正则表达式模式可能会有所帮助。

模式: (?:(?&lt;=\.)|,)(\d+)(?:(?=\.)|,)替换: \1

演示: https://regex101.com/r/KtFX8S/2/

说明:

(?&lt;=\.)|,) - 匹配,. 的正向后视。 结尾的相似匹配模式 在替换中使用捕获的组 1

【讨论】:

以上是关于如果有多个,则匹配所有逗号的主要内容,如果未能解决你的问题,请参考以下文章

如果发现一个逗号分隔记录与另一个逗号分隔记录匹配,则获取记录

where子句中的多个字符匹配

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

sql用逗号连接多张表对应哪个join?

匹配列中的逗号分隔值

如何匹配在linq中具有多个用逗号分隔的整数值的列?