让我说我有(a|b)*(ab)+
的reg exp
我知道*
表示 0或更多,+
表示 1或更多,|
表示或
因此,aab
,ab
,abab
,bbbbbbbbbbbbab
和aaaaaaaaaaaaaaab
可行。
试着理解这些符号,如果只有(a|b)*|(ab)+
一个人就行了,对吗?
但是单独的(a|b)*(ab)+
答案 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)+
,您可以拥有a
和b
的任意组合,只要您的输入至少有一个ab
。
如果要在两个集合之间添加|
,则匹配的第一个集合(首先评估|
左侧的那个集合)将是匹配的集合。
有了这个,(a|b)*|(ab)+
只能与a
匹配,因为(a|b)
只能匹配a
- 而且这个群组位于|
的左侧,所以它是首先评估。
答案 2 :(得分:1)
让我们翻译。
(a|b)*(ab)+
表示:
因此,ab
,bab
,aab
,abab
,aaababbab
中的任何一个都可以使用;但是a
,b
,aaa
,bbb
,bbba
,<empty>
不会。
(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。以及现实世界的正则表达式引擎如何工作。