我正在实施一个简单的正则表达式,我无法弄清星的行为。
假设a * b是我的搜索表达式。当它应用于目标文本aaaaaabbc和1345536会发生什么?
因为星号在前面的字符中占用零个或多个,所以两者都必须通过。这不正确吗?这里的那个http://www.zytrax.com/tech/web/regex.htm说它不是。
如果不是,那么如何使迭代停止?我觉得让它停止打破既定的规则。
--------编辑
我说它必须适用于第二个的原因是这个。应该有零个或多个a,零个a。随着它的继续,它用完了字母,b将没有机会被比较。那不是一场比赛吗?
这就是我无法获得的,如何以及何时获得机会?
答案 0 :(得分:2)
假设a * b是我的搜索表达式。当它应用于目标文本aaaaaabbc和1345536会发生什么?
使用aaaaaabbc
,它开始尝试匹配第一个字符(a
),发现它可以,并继续前进,直到它到达第一个b
。在那一刻它停止,宣布成功。 (默认情况下,某些语言会将正隐式全字符串锚定添加到正则表达式,但通常可以在任何地方匹配。)
使用1345536
,它会尝试匹配第一个字符,发现它不能(它既不是a
也不是b
),所以继续尝试从第二个字符开始一。由于它从未找到可以开始匹配的点,因此整个字符串不匹配。
我们还要考虑aaac
(你没有使用的情况,但仍然提供信息);虽然状态机找到a
并开始尝试匹配,但由于它从未找到强制性 b
,它从未真正完成匹配,字符串不匹配。
我说它必须适用于第二个的原因是这个。应该有零个或多个a,零个a。随着它的继续,它用完了字母,b没有机会被比较。那不是一场比赛吗?
这是我无法得到的,如何以及何时获得机会?
为了a*b
匹配任何内容,它必须包含零个或多个a
s后跟一个强制性b
。是的,a
是可选的,但b
不是; 必须才能找到匹配项。 b
中没有1345536
;它永远不会匹配。 RE引擎将首先查找a
或b
;要么会做。如果找到a
,则会开始尝试匹配a
上的扫描,直到达到b
(匹配)或非b
(和达到非a
)(不匹配)。如果找到的第一个字符是b
;马上就找到了比赛。
简而言之,你有点误解了a*b
的含义。 a
的可选项与b
无关。
答案 1 :(得分:1)
在您给出的示例中,'1345536'字符串将不会与'a * b'匹配,因为它需要'b'。 这些将匹配:
aaaaaaaaab
aaaaaabc
121435b
*符号表示其前面的字符的0或更多,因此,如果您在其上放置“b”,将匹配,“a”仅用于获取匹配组:
test | Group
1aab => aab
ab => ab
bab => b, ab
编辑:
你正在思考的方式不是正则表达式如何工作,它们需要进行最后的测试,根据regular-expressions.info:“只有在尝试了所有可能性并且发现失败时,引擎才会继续第二个角色。“。
当您在1345536上测试* b时,会发生这种情况(实际上并非如此,但您明白了这一点):
'b'获得了测试字符串中 EACH ONE 字符的机会。
答案 2 :(得分:0)
您没有说出哪种语言,但在大多数正则表达式实现中,星号表示“前面一个字符的零或更多”,因此a*b
表示“一个'或多个'后跟一个' b'”。
因此,a*b
应匹配第一个目标中的子字符串aaaaaab
,但在第二个目标中根本不匹配。
答案 3 :(得分:0)
正则表达式与状态机同构。一旦你有了基本的想法,代码应该是显而易见的。计算理论中的任何基础课程都涵盖了这一点;或阅读Ken Thompson's original paper。