交替使用会产生奇怪的行为

时间:2016-03-14 12:32:06

标签: regex

我正在使用这个正则表达式来捕捉字符串末尾的" e"

e\b|e[!?.:;]

它可以工作,但是当我遇到像

这样的输入时,我不明白
"space."

它只需要"e",不包括".",但正则表达式有[!?.:;],这表明它也应该捕获点。

如果我在开头删除e\b|,它也会捕获点。这对我来说没问题,因为我只是想捕获这封信,但是,我需要解释这个行为。

2 个答案:

答案 0 :(得分:1)

正则表达式引擎在找到有效匹配后立即停止搜索。

备选方案的顺序很重要,并且由于首先匹配e,引擎将停止寻找交替的右侧。

在您的情况下,正则表达式引擎从“空格”中的第一个标记开始,它不匹配。然后它移动到第二个,“p”。它仍然不匹配..它一直试图匹配令牌,直到它最终到达“e”,并匹配交替的左侧 - 当发生这种情况时,由于找到匹配,它不会继续。

我强烈建议你通过this tutorial,它给出了很好的解释。

答案 1 :(得分:1)

如果你需要确保在匹配中返回.,只需交换备选方案:

e[!?.:;]|e\b

在NFA正则表达式中,第一个替代匹配胜利。这里也有一些不同的方面需要考虑,但这超出了范围。

更多细节可以在这里找到:

在这种情况下,\be.需要一个非单词字符。由于e\b是一个非单词字符,它满足条件,这就是为什么e[!?.:;](作为第一个替代分支)与SELECT table1.cid, acc, rej, table1.year FROM table1 INNER JOIN table2 ON(table1.year = table2.year and table1.cid = table.cid) WHERE table1.status != 0 AND table1.year = 2015 LIMIT 50 一起获胜的原因,因为两者都能够匹配相同的子字符串at那个位置。

here is what is going on