正则表达式* |

时间:2012-10-17 17:21:29

标签: regex

让我说我有(a|b)*(ab)+的reg exp 我知道*表示 0或更多+表示 1或更多|表示

因此,aababababbbbbbbbbbbbbabaaaaaaaaaaaaaaab可行。

试着理解这些符号,如果只有(a|b)*|(ab)+一个人就行了,对吗? 但是单独的(a|b)*(ab)+

无效

4 个答案:

答案 0 :(得分:4)

你是对的。

(a|b)*|(ab)+只能与a匹配,因为它会采用第一种选择((a|b)*),然后只匹配一个a。事实上,这个正则表达式甚至会匹配一个空字符串。

另一方面,

(a|b)*(ab)+无法选择任何内容,它可能与0 (a|b)匹配,但必须至少有一个ab

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

答案 1 :(得分:2)

你是正确的。

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

(a|b)

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

(a|b)*

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

第二组:

(ab)

这要求必须有a后跟b。添加+会使其出现1次或更多次:

(ab)+

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

结合到(a|b)*(ab)+,您可以拥有ab的任意组合,只要您的输入至少有一个ab

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

有了这个,(a|b)*|(ab)+只能与a匹配,因为(a|b)只能匹配a - 而且这个群组位于|的左侧,所以它是首先评估。

答案 2 :(得分:1)

让我们翻译。

  1. (a|b)*(ab)+表示:

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

    因此,abbabaabababaaababbab中的任何一个都可以使用;但是abaaabbbbbba<empty>不会。

  2. (a|b)*|(ab)+表示:

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

    因此,以上所有内容都会匹配,因为它们都匹配第一个替代(a|b)*。有些也只是发生以匹配第二个替代(ab)+,但实际上并不重要 - 第二个替代完全被第一个替代,并且永远不会被检查!

答案 3 :(得分:1)

(a|b)*|(ab)+

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

(a|b)*(ab)+

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

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