假设我有 reg exp(a|b)*(ab)+
我知道这*
意味着0 或更多,+
意味着1 或更多,|
意味着要么或?
所以, aab
, ab
, abab
, bbbbbbbbbbbbab
andaaaaaaaaaaaaaaab
会起作用。
(a|b)*|(ab)+
如果它是单独的,试图理解这些符号会起作用,对吗?
但是一个人不会为(a|b)*(ab)+
假设我有 reg exp(a|b)*(ab)+
我知道这*
意味着0 或更多,+
意味着1 或更多,|
意味着要么或?
所以, aab
, ab
, abab
, bbbbbbbbbbbbab
andaaaaaaaaaaaaaaab
会起作用。
(a|b)*|(ab)+
如果它是单独的,试图理解这些符号会起作用,对吗?
但是一个人不会为(a|b)*(ab)+
你说的对。
(a|b)*|(ab)+
只能匹配a
,因为它将采用第一个替代项 ( (a|b)*
),然后完全匹配一个a
。事实上,这个正则表达式甚至可以匹配一个空字符串。
(a|b)*(ab)+
另一方面,不能选择任何东西,它可能匹配 0(a|b)
但必须至少有一个ab
。
另请注意,第一个正则表达式等效于(a|b)*
and [ab]*
,因为这已经涵盖了重复 的可能性(ab)
。(事实上,在捕获子组方面存在细微差别,但这可能超出了您的相关或适用范围)。
你是正确的。
为了更清楚地画出来,或者至少在没有实际图像的情况下尽可能地画出来,我们可以分段查看不同的部分。
(a|b)
这将匹配a
或 b
。现在,如果您在其中添加一个*
(名为“kleene star”),它将匹配 0 次或多次:
(a|b)*
由于这是在您的正则表达式的开头,它表明您可以在输入的开头使用a
和/或的任何重复组合。b
第二组:
(ab)
a
这要求后面必须有a b
。添加 a+
使其发生 1 次或多次:
(ab)+
因此,由于这是在您的正则表达式的末尾,它表明您可能ab
在我们的字符串末尾有一个或多个重复序列。
组合成(a|b)*(ab)+
,你可以有和的任意组合a
,b
只要你的输入至少以一个结尾ab
。
如果您要|
在两个集合之间添加 a,则第一个匹配的集合(第一个在|
评估左侧的集合)将是匹配的集合。
有了这个,(a|b)*|(ab)+
can match just a
because (a|b)
can match just a
- 这个组在左边,|
所以它首先被评估。
让我们翻译。
(a|b)*(ab)+
方法:
因此,任何ab
, bab
, aab
, abab
,aaababbab
都会起作用;但是a
, b
, aaa
, bbb
, bbba
,<empty>
不会。
(a|b)*|(ab)+
方法:
因此,以上所有内容都将匹配,因为它们都将匹配第一个替代方案(a|b)*
。有些也恰好与第二种选择相匹配,(ab)+
但实际上并不重要——第二种选择完全被第一种覆盖,永远不会被检查!
(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。以及现实世界的正则表达式引擎是如何工作的。