3

假设我有 reg exp(a|b)*(ab)+ 我知道这*意味着0 或更多+意味着1 或更多|意味着要么或

所以, aab, ab, abab, bbbbbbbbbbbbabandaaaaaaaaaaaaaaab会起作用。

(a|b)*|(ab)+如果它是单独的,试图理解这些符号会起作用,对吗?
但是一个人不会为(a|b)*(ab)+

4

4 回答 4

4

你说的对。

(a|b)*|(ab)+只能匹配a,因为它将采用第一个替代项 ( (a|b)*),然后完全匹配一个a。事实上,这个正则表达式甚至可以匹配一个空字符串。

(a|b)*(ab)+另一方面,不能选择任何东西,它可能匹配 0(a|b)但必须至少有一个ab

另请注意,第一个正则表达式等效于(a|b)*and [ab]*,因为这已经涵盖了重复 的可能性(ab)。(事实上​​,在捕获子组方面存在细微差别,但这可能超出了您的相关或适用范围)。

于 2012-10-17T17:26:46.450 回答
2

你是正确的。

为了更清楚地画出来,或者至少在没有实际图像的情况下尽可能地画出来,我们可以分段查看不同的部分。

(a|b)

这将匹配a b。现在,如果您在其中添加一个*(名为“kleene star”),它将匹配 0 次或多次:

(a|b)*

由于这是在您的正则表达式的开头,它表明您可以在输入的开头使用a和/或的任何重复组合。b

第二组:

(ab)

a这要求后面必须有a b。添加 a+使其发生 1 次或多次:

(ab)+

因此,由于这是在您的正则表达式的末尾,它表明您可能ab在我们的字符串末尾有一个或多个重复序列。

组合成(a|b)*(ab)+,你可以有和的任意组合ab只要你的输入至少以一个结尾ab

如果您要|在两个集合之间添加 a,则第一个匹配的集合(第一个在|评估左侧的集合)将是匹配的集合。

有了这个,(a|b)*|(ab)+can match just abecause (a|b)can match just a- 这个组在左边,|所以它首先被评估。

于 2012-10-17T17:31:40.670 回答
1

让我们翻译。

  1. (a|b)*(ab)+方法:

    • 零个或多个(“a”或“b”)
    • 后跟一个或多个“ab”

    因此,任何ab, bab, aab, abab,aaababbab都会起作用;但是a, b, aaa, bbb, bbba,<empty>不会。

  2. (a|b)*|(ab)+方法:

    • 零个或多个(“a”或“b”)
    • 由“ab”中的一个或多个

    因此,以上所有内容都将匹配,因为它们都将匹配第一个替代方案(a|b)*。有些也恰好第二种选择相匹配,(ab)+但实际上并不重要——第二种选择完全被第一种覆盖,永远不会被检查!

于 2012-10-17T17:30:53.523 回答
1
(a|b)*|(ab)+

(a|b)*表示 0 个或多个可以是 a 或 b 的字符。换句话说,“a”和“b”的任意组合。(ab)+表示 1 个或多个“ab”。将|它们放在它们之间,这意味着一个或另一个。所以是的,单独使用“a”就可以了。

(a|b)*(ab)+

第一部分是相同的,0个或多个字符,可以是'a'或'b'。但是没有'|' 这意味着串联。所以在你的'a'和'b'序列之后,后面跟着1个或多个'ab'。

我建议你阅读这个。它解释了正式正则表达式中的三个操作:kleene star、altercation 和 concatenation。以及现实世界的正则表达式引擎是如何工作的。

于 2012-10-17T17:31:27.033 回答