正则表达式的改变表现得很贪婪

时间:2014-09-05 19:40:29

标签: regex

我不确定我是否可以称之为贪婪,但这是一个带有改动的简单正则表达式。

  • 正则表达式:val|get|valueget|eva

  • 文字输入:aevalueget

根据我的理解,它应符合" val"因为val是模式中最左边的表达式,它优先。由于Input中有一个匹配的子字符串,它应匹配" val"并应该停止进一步搜索。 但上述案例中的匹配是" eva"这是模式中最正确的表达方式。 实际上,模式中的所有表达式在Input中都有一个匹配的子字符串,但似乎它在模式中选择了最右边的表达式。 我想弄清楚这一点。如果有人能够解释这种行为,那将是非常好的。

2 个答案:

答案 0 :(得分:2)

正则表达本质上并不像你想要的那样优先。他们只是迭代字符串,并尝试在他们看到时建立匹配。

如果您想在val eva之前匹配eval,那么您需要运行2个正则表达式,1个接一个。第一个用于val,第二个用于eva

答案 1 :(得分:2)

发生这种情况的原因是因为正则表达式处理器一次向下移动字符串,试图找到匹配项。由于eva位于字符串中最左侧,因此在后续val的任何比较之前都会找到它。

而不是想象正则表达式引擎正在搜索val的整个字符串,而是get,然后是valueget,然后是eva,它的工作原理更多像这样:

|aevalueget

从这里开始,它与val不匹配,因此会检查get,然后检查valueget,然后检查eva。这些都不匹配,所以它移动到下一个位置:

a|evaluget

从这里开始,它与valgetvalueget不匹配,但 匹配{{1所以正则表达式已匹配。