为什么是正则表达式([£€$¥£] | USD | US \ $)\ s?(\ d *。?\ d + | \ d {1,3}(,\ d {3}) *(。\ d +)?)不匹配150,000.00美元
正则表达式1:
([£€$¥£]|USD|US\$)\s?
匹配美元
正则表达式2:
(\d*\.?\d+|\d{1,3}(,\d{3})*(\.\d+)?)
匹配150,000.00
两个表达式的串联
([£€$¥£]|USD|US\$)\s?(\d*\.?\d+|\d{1,3}(,\d{3})*(\.\d+)?)
与US $ 150,000.00不匹配
演示:https://regex101.com/r/fJJWqv/1
EDIT:正则表达式2不匹配150,000.00,但由于(,\ d {3})*吗,它也不应匹配逗号吗?
答案 0 :(得分:1)
在150,000.00
中使用模式(\d*\.?\d+|\d{1,3}(,\d{3})*(\.\d+)?)
的情况下,它不会与逗号匹配,因为150将由\d*\.?\d+
进行匹配,并且没有其他选择都以逗号开头。
之所以会这样,是因为\d*
表示0+数字,因此将匹配150。然后\.?
是一个可选点,因此它继续到\d+
。
由于跟踪\d*
可以放弃一场比赛,以匹配\d+
中至少一位的数字,而150则将保留比赛。
然后下一个字符是,
,但是所有的替换都不以逗号开头,因此尝试使用下一个字符,这一次\d*\.?\d+
可以与000.00
匹配。
一个与您的值匹配的选项(如果只希望匹配,则可以省略捕获组)是删除此部分\d*\.?\d+
(?:[£€$¥£]|USD|US\$)\s?\d{1,3}(?:,\d{3})*(?:\.\d+)?
答案 1 :(得分:0)
您的第二项主张不真实。 (\d*\.?\d+|\d{1,3}(,\d{3})*(\.\d+)?)
与150,000.00
不匹配。相反,它匹配150
和000.00
。由于只有前者的前缀为US $
,因此只有它与第三个正则表达式匹配。
这样做的原因是您指定的交替顺序有利于较短的匹配。要解决此问题,您可以切换交替顺序:将(\d*\.?\d+|\d{1,3}(,\d{3})*(\.\d+)?)
更改为(\d{1,3}(,\d{3})*(\.\d+)?|\d*\.?\d+)
。