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

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

这是我目前的尝试:

[^\d,.]|[.,](?=.*[.,])|(?<=,.*),
  1. [^\d,.] 匹配所有不是逗号或点的非数字字符(因为它们还使用 ' 作为分隔符,而不仅仅是点和逗号)
  2. [.,](?=.*[.,]) 匹配所有逗号和后面仍跟一个点或逗号的点
  3. (?&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 应该变成什么?

标签: regex regex-lookarounds


【解决方案1】:

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

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

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

说明:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 2022-11-29
    • 1970-01-01
    • 2021-10-26
    • 2022-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多