我正在使用这个正则表达式来捕捉字符串末尾的" e"
e\b|e[!?.:;]
它可以工作,但是当我遇到像
这样的输入时,我不明白"space."
它只需要"e"
,不包括"."
,但正则表达式有[!?.:;]
,这表明它也应该捕获点。
如果我在开头删除e\b|
,它也会捕获点。这对我来说没问题,因为我只是想捕获这封信,但是,我需要解释这个行为。
答案 0 :(得分:1)
正则表达式引擎在找到有效匹配后立即停止搜索。
备选方案的顺序很重要,并且由于首先匹配e
,引擎将停止寻找交替的右侧。
在您的情况下,正则表达式引擎从“空格”中的第一个标记开始,它不匹配。然后它移动到第二个,“p”。它仍然不匹配..它一直试图匹配令牌,直到它最终到达“e”,并匹配交替的左侧 - 当发生这种情况时,由于找到匹配,它不会继续。
我强烈建议你通过this tutorial,它给出了很好的解释。
答案 1 :(得分:1)
如果你需要确保在匹配中返回.
,只需交换备选方案:
e[!?.:;]|e\b
在NFA正则表达式中,第一个替代匹配胜利。这里也有一些不同的方面需要考虑,但这超出了范围。
更多细节可以在这里找到:
..X
from .X|..X|X.
? 在这种情况下,\b
:e
后.
需要一个非单词字符。由于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那个位置。