假设我有 reg exp(a|b)*(ab)+
我知道这*意味着0 或更多,+意味着1 或更多,|意味着要么或?
所以, aab, ab, abab, bbbbbbbbbbbbabandaaaaaaaaaaaaaaab会起作用。
(a|b)*|(ab)+如果它是单独的,试图理解这些符号会起作用,对吗?
但是一个人不会为(a|b)*(ab)+
假设我有 reg exp(a|b)*(ab)+
我知道这*意味着0 或更多,+意味着1 或更多,|意味着要么或?
所以, aab, ab, abab, bbbbbbbbbbbbabandaaaaaaaaaaaaaaab会起作用。
(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 abecause (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。以及现实世界的正则表达式引擎是如何工作的。