如果有多个,则匹配所有逗号
Posted
技术标签:
【中文标题】如果有多个,则匹配所有逗号【英文标题】:Match all commas if there's multiple 【发布时间】:2020-12-14 16:39:44 【问题描述】:我需要从字符串中删除所有非数字字符。因为人们使用不同的千位分隔符——有些人认为为此目的使用逗号非常好,而且一点也不容易与小数点混淆(特别是因为有些国家使用逗号作为小数点),正则表达式变得很烦人。
这是我目前的尝试:
[^\d,.]|[.,](?=.*[.,])|(?<=,.*),
[^\d,.]
匹配所有不是逗号或点的非数字字符(因为它们还使用 '
和 ’
作为分隔符,而不仅仅是点和逗号)
[.,](?=.*[.,])
匹配所有逗号和后面仍跟一个点或逗号的点
(?<=,.*),
匹配所有逗号,如果我们之前看到过逗号,已经
(稍后我可能不得不将(2)分成两种情况,但这不是这个问题的问题。
(3) 的目的是如果字符串包含多个逗号,我们可以安全地假设它用作千位分隔符而不是小数点。
即
123,456
应解释为 123.456
(因此 ,
与正则表达式不匹配)
123,456,789
应被解释为 123456789
(因此 both 逗号匹配正则表达式)
当然(?<=,.*),
是无效的,因为look-behinds 需要是固定长度,而.*
不是。
如何匹配这些讨厌的逗号?
(目的是最终将正则表达式提供给 Java 字符串替换方法。)
var sanitisedInput = rawInput.replaceAll(<regex>, "")
【问题讨论】:
您如何预测123,456
应该被视为123.456
而不是123456
?
您是否保证所有十进制数只保留 2 位或更少?
@VighneshRaut 我没有。这是我们做出并记录的假设。考虑到某些人使用,
作为小数点,这对我们来说听起来更安全。
@MonkeyZeus 不,我们没有。 Afaik,最多有 6 位小数。 (而且我可能不得不在之后为科学记数法调整正则表达式,但一次一个问题。)
那么123,456.789
和123.456,789
应该变成什么?
【参考方案1】:
下面的正则表达式模式可能会有所帮助。
模式: (?:(?<=\.)|,)(\d+)(?:(?=\.)|,)
替换: \1
演示: https://regex101.com/r/KtFX8S/2/
说明:
(?<=\.)|,)
- 匹配,
或.
的正向后视。
结尾的相似匹配模式
在替换中使用捕获的组 1
【讨论】:
以上是关于如果有多个,则匹配所有逗号的主要内容,如果未能解决你的问题,请参考以下文章