【问题标题】:Regex to remove commas from numbers under 10,000正则表达式从 10,000 以下的数字中删除逗号
【发布时间】:2020-10-15 16:39:56
【问题描述】:

我需要一个正则表达式来去除 10,000 以下的所有数字中的逗号,例如 9999 但 10,000、1,000,000 等。

这适用于 9,999,正确忽略 10,000,但搞砸了 1,000,000 (1000,000):

\b([0-9]),([0-9]{3}) 
$1$2

很遗憾,我不能简单地排除 9999 等 4 位数字后面的逗号。我尝试了另一种方法,但它错过了 9,999:

\b(?<![.,])(?<d1>\d{2})(?<d2>\d{3})(?!,)\b
$1,$2

有什么想法吗? 谢谢, 兰迪

更新:对不起,我忘了提到这必须在 .NET 中工作,所以 \K 将无法工作......

【问题讨论】:

  • 您使用哪种编程语言?更好的马赫数并以编程方式进行比较。
  • 对不起,我忘了说这必须在 .NET 中工作,所以 \K 不会工作

标签: regex numbers comma


【解决方案1】:

您可以简单地在您的正则表达式之后插入 [0-9]{1-3}

\b([0-9]),([0-9]{3})(,[0-9]{1-3}) 

或类似的东西:

\d+((,)\d+)

也可以。

【讨论】:

  • 谢谢你,但我无法让它为我工作
【解决方案2】:

要匹配 10,000 以下的数字,您可以匹配逗号前的单个数字而不是 2,并且匹配逗号后的 1-3 位数字也可以匹配 1,9。

为了防止部分匹配,您可以断言空白边界。

(?<!\S)(?<d1>\d),(?<d2>\d{1,3})(?!\S)

Regex demo

【讨论】:

  • 赞成,但当我测试它时,它不会从任何位置删除逗号,但可能是最后一个位置。您专注于逗号的第二个位置?
  • @JvdV 我假设 OP 的意思是从 0,0 到 9,999。也许我误解了这个问题。
  • @Randy 你可以匹配 3 位数字而不是 1-3 (?&lt;!\S)(?&lt;d1&gt;\d),(?&lt;d2&gt;\d{3})(?!\S) regex101.com/r/a3YWFr/1
  • @Randy 你的意思是1000000 应该变成1,000,000 吗?如果是这样,您可以首先匹配所有数字(?&lt;!\S)\d+(?!\S)regex101.com/r/4XAPIL/1,然后使用此模式(?&lt;=\d)(?=(?:\d{3})+(?!\S)) 并用逗号替换regex101.com/r/q4q7Ns/1
  • 您可以使用诸如 7 或更多 {7,} 之类的量词来指定要首先匹配的位数 (?&lt;!\S)\d{7,}(?!\S)regex101.com/r/ia9xyD/1
【解决方案3】:

这是我的两分钱:

(?:^(?=(?:,*\d,*){1,4}$)|\G(?!^))\d*\K,(?!$)

在线查看Demo

我的想法是删除字符串中任何位置的任何逗号,例如:,,,89,,,9 等,只要最多只有 4 位数字。

【讨论】:

  • 啊,我明白你的意思是:-) 我认为逗号在标点符号的问题中的数字之后。在那种情况下 +1(不是所有引擎都支持 \G 和 \K)
  • 你自己可能是对的。无论如何,我希望我正确地实现了这些。我通过你的帖子了解到这一点 bytw ;) @Thefourthbird
  • 我认为你必须使用\G(?!^) 看到这个example 与这个example 如果4 位的断言失败,它将评估OR |,这是真的,因为@987654329 @ 匹配 2 个位置。然后它将开始比赛。使用\G(?!^) 可以防止这种情况发生。
  • 太好了,我会记住的!感谢您的洞察力。
  • 非常感谢你们的努力!抱歉,我忘了说这必须在 .NET 中工作,所以看起来 \K 不起作用...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多