0

我正在实现一个简单的正则表达式,但我无法确定 star 的行为。

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

因为 star 需要零个或多个前面的字符,所以两者都必须通过。这不正确吗?这里的http://www.zytrax.com/tech/web/regex.htm说不是。

如果确实不是,那么如何使迭代停止?我觉得让它停止违反了既定规则。

- - - - 编辑

我说它必须适用于第二个的原因是这个。应该有零个或多个a,并且有零个a。随着它的继续,它的字母用完了, b 将没有机会与之进行比较。所以这不是比赛吗?

那是我无法得到的,b 如何以及何时获得机会?

4

4 回答 4

2

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

使用aaaaaabbc,它开始尝试匹配第一个字符 (an a),发现可以匹配,然后继续运行,直到到达第一个b。在这一点上它停止,宣布成功。(某些语言默认为正则表达式添加隐式的全字符串锚定,但通常可以匹配任何地方。)

使用1345536,它尝试匹配第一个字符,发现它不能(它既不是a也不是b),因此继续尝试从第二个字符开始。由于它永远找不到可以开始匹配的点,因此整个字符串不匹配。

让我们也考虑一下aaac(一个您没有使用过但仍然提供信息的案例);尽管状态机找到了a并开始尝试匹配,但由于它从未找到强制 b的,它实际上从未完成匹配并且字符串不匹配。

我说它必须适用于第二个的原因是这个。应该有零个或多个a,并且有零个a。随着它的继续,它的字母用完了, b 将没有机会与之进行比较。所以这不是比赛吗?

那是我无法得到的,b 如何以及何时获得机会?

为了a*b匹配任何东西,它必须有一个零个或多个as 的运行,然后是一个强制的b。是的,as 是可选的,但b不是;它必须存在才能找到匹配项。里面没有b1345536它永远不会匹配。RE 引擎将寻找 aa或 ab开始;两者都可以。如果找到 a a,它将开始尝试在as 上进行匹配扫描,直到b达到 a(匹配)或达到非b(和非a)(非匹配)。如果找到的第一个字符是b; 立即找到匹配项。

简而言之,你有点误解了什么a*b意思。的可选性ab.

于 2012-08-08T21:02:15.363 回答
1

在您给出的示例中,“1345536”字符串不会被“a*b”匹配,因为它需要一个“b”。这些将匹配:

aaaaaaaaab
aaaaaabc
121435b

* 符号表示它前面的 0 个或多个字符,因此,如果你在它的任何地方放一个 'b',将被匹配,'a' 仅用于获取匹配组:

test  | Group
1aab => aab
ab   => ab
bab  => b, ab

编辑:

根据regular-expressions.info,您思考的方式不是正则表达式的工作方式,它们需要测试到底:“只有在尝试了所有可能性并发现失败时,引擎才会继续执行第二个特点。”。

当您在 1345536 上测试 a*b 时,会发生这种情况(实际上并非如此,但您明白了):

  • 检查第一个字符
  • 是一个'a'吗?
  • 没有
  • 是'b'吗?
  • 没有
  • 然后转到下一个字符

'b'在测试字符串中的每个字符上都有机会。

于 2012-08-08T19:01:39.470 回答
0

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

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

于 2012-08-08T18:56:28.040 回答
0

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

于 2012-08-08T19:40:44.933 回答