首页 > 解决方案 > 正则表达式匹配字符串中的多个数字

问题描述

我想从字符串中提取数字,例如

这三个城镇有1000人。

并得到一个像["1,000", "3"].

在这个问题中,我从贾斯汀那里得到了以下与正则表达式匹配的数字

^[+-]?(\d*|\d{1,3}(,\d{3})*)(\.\d+)?\b$

这对于检查它是否是一个数字很有用,但要让它在一个句子上工作,你需要删除“^”和“$”。

regex101 定义了开始/结束 regex101 没有定义开始/结束

如果没有定义开始和结束,您会得到一堆长度为 0 的匹配项,这些匹配项很容易被丢弃,但现在它也会用逗号分割任何数字。

如何使该正则表达式(或新的正则表达式)在句子上工作,并且仍然可以找到其中带有逗号的数字。

奖励将不会有所有 0 长度匹配。

标签: javascriptregex

解决方案


/-?\d(?:[,\d]*\.\d+|[,\d]*)/g如果您可以允许不同的组,例如 1,00,000(在某些语言环境中这不是未知的),则表达式应该这样做。我觉得我应该能够进一步简化它,但是当我尝试示例时,“333.33”被分解为“333”和“33”作为单独的数字。与上面它保持在一起。

现场示例:

const str = "There are 10,000 people in those 3 towns. That's 3,333.33 people per town, roughly. Which is about -67.33 from last year.";
const rex = /-?\d(?:[,\d]*\.\d+|[,\d]*)/g;
let match;
while ((match = rex.exec(str)) !== null) {
    console.log(match[0]);
}

分解/\d(?:[,\d]*\.\d+|[,\d]*)/g

  • -?- 一个可选的减号(感谢x15他/她的回答中指出这一点!)
  • \d- 一个数字
  • (?:...|...)- 一个非捕获组,包含之间的交替
    • [,\d]*\.\d+- 零个或多个逗号和数字后跟一个.和一个或多个数字,例如3,333.33;或者
    • [,\d]*- 零个或多个逗号和数字

第一个选项将贪婪匹配,如果没有小数点,则回退到第二个选项。


推荐阅读