【问题标题】:Regex matching multiple numbers in a string正则表达式匹配字符串中的多个数字
【发布时间】:2019-11-02 13:24:33
【问题描述】:

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

这 3 个城镇有 1000 人。

得到一个像["1,000", "3"]这样的数组。

我从Justin in this question得到了以下匹配正则表达式的号码

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

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

regex101 with start/end defined regex101 without start/end defined

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

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

奖励将不是所有长度为 0 的匹配项。

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    表达式 /-?\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

    • -? - 一个可选的减号(感谢x15his/her answer 中标记它!)
    • \d - 一个数字
    • (?:...|...) - 一个非捕获组,包含之间的交替
      • [,\d]*\.\d+ - 零个或多个逗号和数字后跟 . 和一个或多个数字,例如3,333.33;或
      • [,\d]* - 零个或多个逗号和数字

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

    【讨论】:

    • 非常感谢!我在其末尾添加了(\.\d+)? 以允许使用小数。
    • @SamDean - 啊,好点子!但我认为这还不够,一秒钟。
    • @SamDean - 我已经更新它来处理小数,抱歉我错过了。它比在它后面添加(\.\d+)? 更复杂。 :-)
    • @SamDean - 嗯...我们没有处理减号。 :-) 所以可能想要一个-? 在前面。 (如果您还想允许一元 +,则为 [+-]?。)
    【解决方案2】:

    另一种方法是用空格分割,看看值是否可以解析为数字,

    let numberExtractor = str => str.split(/\s+/)
                                    .filter(v => v && parseFloat(v.replace(/[.,]/g, '')))
    
    
    console.log(numberExtractor('There are 1,000 people in those 3 towns. some more numbers -23.012 1,00,000,00'))

    【讨论】:

      【解决方案3】:

      匹配整数和十进制数字,其中整个部分可以有可选
      在数字之间但不在小数部分的逗号是这样完成的:

      /[+-]?(?:(?:\d(?:,(?=\d))?)+(?:\.\d*)?|\.\d+)/

      https://regex101.com/r/yOuBPx/1

      输入样本并未反映此正则表达式处理的所有边界条件。
      最好尝试一下,看看它的全部效果。

      【讨论】:

      • 当在一个接受的答案之后发布一个答案时,指出它处理前一个没有处理的内容是很有用的,这样人们就可以更容易地看到这一点并认识到附加答案的好处。 (如果没有任何东西或不重要,那么根本不发布可能是最好的,小事可以在答案上进行。)
      • @TJ.Crowder - 刚刚说明了它的作用,并且应该针对所有边界效应探索正则表达式。与接受的答案明显不同。
      • @Thefourthbird - 可能是尾随点将其区分为浮点数。但是,鉴于逗号可以在非千位,这是一个混乱的规范。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-11
      • 1970-01-01
      • 2021-10-29
      • 1970-01-01
      • 1970-01-01
      • 2016-11-18
      相关资源
      最近更新 更多