正则表达式与完整输入不匹配

时间:2019-06-22 16:50:51

标签: regex

为什么是正则表达式([£€$¥£] | 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})*吗,它也不应匹配逗号吗?

2 个答案:

答案 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+)?

Regex demo

答案 1 :(得分:0)

您的第二项主张不真实。 (\d*\.?\d+|\d{1,3}(,\d{3})*(\.\d+)?)150,000.00不匹配。相反,它匹配150000.00。由于只有前者的前缀为US $,因此只有它与第三个正则表达式匹配。

这样做的原因是您指定的交替顺序有利于较短的匹配。要解决此问题,您可以切换交替顺序:将(\d*\.?\d+|\d{1,3}(,\d{3})*(\.\d+)?)更改为(\d{1,3}(,\d{3})*(\.\d+)?|\d*\.?\d+)