我不确定我是否可以称之为贪婪,但这是一个带有改动的简单正则表达式。
正则表达式:val|get|valueget|eva
文字输入:aevalueget
根据我的理解,它应符合" val"因为val是模式中最左边的表达式,它优先。由于Input中有一个匹配的子字符串,它应匹配" val"并应该停止进一步搜索。 但上述案例中的匹配是" eva"这是模式中最正确的表达方式。 实际上,模式中的所有表达式在Input中都有一个匹配的子字符串,但似乎它在模式中选择了最右边的表达式。 我想弄清楚这一点。如果有人能够解释这种行为,那将是非常好的。
答案 0 :(得分:2)
正则表达本质上并不像你想要的那样优先。他们只是迭代字符串,并尝试在他们看到时建立匹配。
如果您想在val
eva
之前匹配eval
,那么您需要运行2个正则表达式,1个接一个。第一个用于val
,第二个用于eva
答案 1 :(得分:2)
发生这种情况的原因是因为正则表达式处理器一次向下移动字符串,试图找到匹配项。由于eva
位于字符串中最左侧,因此在后续val
的任何比较之前都会找到它。
而不是想象正则表达式引擎正在搜索val
的整个字符串,而是get
,然后是valueget
,然后是eva
,它的工作原理更多像这样:
|aevalueget
从这里开始,它与val
不匹配,因此会检查get
,然后检查valueget
,然后检查eva
。这些都不匹配,所以它移动到下一个位置:
a|evaluget
从这里开始,它与val
,get
或valueget
不匹配,但 匹配{{1所以正则表达式已匹配。