【问题标题】:Regular expression to match numbers with a slight issue正则表达式匹配数字有一个小问题
【发布时间】:2011-10-19 06:09:36
【问题描述】:

我的问题是从货币列表中提取数字。

我的测试数据会是这样的

$100.00
AUD 2012.00
Rs. 234.0 ASD
133 USD
Another thing 1233S.E122
Blah Blah 1.23 
SG$ 013.3
23.03 Something
Something T1233S.122S Else
Whatever 2

而我想出的正则表达式是

(\d+)\.?(\d+)?

基本上,一个数字后跟一个可选的点和另一个可选的数字。

所以while this works fine,它的工作原理比我想要的要多一点。例如它匹配

1233S.E122 中的 1233 和 122 与 T1233S.122S 相同

我了解因为我使用 全局标志 运行它,所以所有数字都匹配。

如何使它不匹配在开头、中间或结尾包含非数字的那些?

由于我是 RegEx 的初学者,请您简要解释一下您的答案。

【问题讨论】:

    标签: regex numbers


    【解决方案1】:

    使用一些单词边界...

    \b\d+(?:\.\d+)?\b
    

    这将匹配带有可选小数位且被单词边界包围的数字。

    RegExr.

    我还整理了你的正则表达式,假设你想匹配整数而不是单独的小数。

    【讨论】:

    • 效果很好:) ?: 有什么作用?我想出了\b(\d+)\.?(\d+)?\b,看起来它工作正常。我错过了什么吗?
    • @RanhiruCooray: ?: 只是使捕获组不捕获。
    【解决方案2】:

    如果最多有一个非数字字符,并且您知道该字符始终是大写的,您应该能够定义一个字符范围,如 [A-Z]*。星号告诉脚本在该范围内查找 0 或 1 个字符,并且在它之前没有任何内容,该字符可以在序列中的任何位置。

    如果您只想在字符串的开头查找非数字字符,请在范围前添加一个“^”符号,如下所示:“^[A-Z]”。这只会在字符串的开头查找大写字母;如果您不希望字母出现在其他地方,则必须专门限制其他地方的范围。

    您也可以要求这样的数字:“[0-9]+”。这将匹配该范围内的一个或多个字符,从而确保您得到带有数字的东西。

    总而言之,它看起来像这样(假设一个字母可以在任何地方):

    /[A-Z]*[0-9]+./g(用于 javascript)

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2011-07-17
      • 2011-05-25
      • 2012-06-10
      • 2017-09-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多