【发布时间】: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应该变成什么?