假设 a*b 是我的搜索表达式。当它应用于目标文本 aaaaaabbc 和 1345536 时会发生什么?
使用aaaaaabbc
,它开始尝试匹配第一个字符 (an a
),发现可以匹配,然后继续运行,直到到达第一个b
。在这一点上它停止,宣布成功。(某些语言默认为正则表达式添加隐式的全字符串锚定,但通常可以匹配任何地方。)
使用1345536
,它尝试匹配第一个字符,发现它不能(它既不是a
也不是b
),因此继续尝试从第二个字符开始。由于它永远找不到可以开始匹配的点,因此整个字符串不匹配。
让我们也考虑一下aaac
(一个您没有使用过但仍然提供信息的案例);尽管状态机找到了a
并开始尝试匹配,但由于它从未找到强制 b
的,它实际上从未完成匹配并且字符串不匹配。
我说它必须适用于第二个的原因是这个。应该有零个或多个a,并且有零个a。随着它的继续,它的字母用完了, b 将没有机会与之进行比较。所以这不是比赛吗?
那是我无法得到的,b 如何以及何时获得机会?
为了a*b
匹配任何东西,它必须有一个零个或多个a
s 的运行,然后是一个强制的b
。是的,a
s 是可选的,但b
不是;它必须存在才能找到匹配项。里面没有b
;1345536
它永远不会匹配。RE 引擎将寻找 aa
或 ab
开始;两者都可以。如果找到 a a
,它将开始尝试在a
s 上进行匹配扫描,直到b
达到 a(匹配)或达到非b
(和非a
)(非匹配)。如果找到的第一个字符是b
; 立即找到匹配项。
简而言之,你有点误解了什么a*b
意思。的可选性a
与b
.