正则表达式中的明星行为

时间:2012-08-08 18:52:03

标签: regex

我正在实施一个简单的正则表达式,我无法弄清星的行为。

假设a * b是我的搜索表达式。当它应用于目标文本aaaaaabbc和1345536会发生什么?

因为星号在前面的字符中占用零个或多个,所以两者都必须通过。这不正确吗?这里的那个http://www.zytrax.com/tech/web/regex.htm说它不是。

如果不是,那么如何使迭代停止?我觉得让它停止打破既定的规则。

--------编辑

我说它必须适用于第二个的原因是这个。应该有零个或多个a,零个a。随着它的继续,它用完了字母,b将没有机会被比较。那不是一场比赛吗?

这就是我无法获得的,如何以及何时获得机会?

4 个答案:

答案 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引擎将首先查找ab;要么会做。如果找到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时,会发生这种情况(实际上并非如此,但您明白了这一点):

  • 检查第一个字符
  • 是'a'吗?
  • 都能跟得上
  • 是'b'吗?
  • 都能跟得上
  • 然后转到下一个角色

'b'获得了测试字符串中 EACH ONE 字符的机会。

答案 2 :(得分:0)

您没有说出哪种语言,但在大多数正则表达式实现中,星号表示“前面一个字符的零或更多”,因此a*b表示“一个'或多个'后跟一个' b'”。

因此,a*b应匹配第一个目标中的子字符串aaaaaab,但在第二个目标中根本不匹配。

答案 3 :(得分:0)

正则表达式与状态机同构。一旦你有了基本的想法,代码应该是显而易见的。计算理论中的任何基础课程都涵盖了这一点;或阅读Ken Thompson's original paper