正则表达式匹配单词与三个b,正确的形式?

时间:2014-04-16 11:31:00

标签: regex

我觉得这很模糊和模糊,我很想理解

我有这些字符串

abbb
bbb
aaaabaaabaaabaaabaaabaaab
babba
bbbaaaa
aaaaabbaba

它们都有效,因为包含多个b,然后我使用:

  • (a*ba*ba*ba*)*这与所有人匹配
  • (a*ba*ba*b)*a*这一切也与他们匹配
  • a*(ba*ba*ba*)*与上述相同

这些真的都一样吗?还是有一些我没有看到的边缘情况?

3 个答案:

答案 0 :(得分:1)

*为零或更多。所以,

即使您使用正如下面的正则表达式匹配

(d*ef*gg*hi*)*
(s*o*m*e*t*h*i*n*g*)

他们将匹配

(a*ba*ba*ba*)*

(匹配一个单词,其中可能有一个或没有或多个a然后是ab然后是0或更多a' s然后是ab然后0或更多a&a; s和一个b和然后0或者更多这些匹配的零个或多个.. 如果我们找不到匹配那就没关系那就是你想说的。

同样适用于您的第二个案例:

(a*ba*ba*b)*a* 

(0或更多a然后是b然后是0或更多a然后是b然后是0或更多a然后是b)0或更多的这一点,以及之后的零或更多。

因此,你的正则表达式基本上匹配了很多0存在条件,这就是为什么你无法找到明显的区别。更好地使用+代替*+ quatifier只会使该字符的匹配至少1次或更多次。

您可以在此网站上使用正则表达式:http://regex101.com/r/rM5zQ1

基础学习regexone对你真的很有帮助。

希望有所帮助!

答案 1 :(得分:1)

所有正则表达式都与空字符串匹配,后者没有3 b。

这一个,

(a*ba*ba*ba*)*

aa不符。但是以下匹配aa,它们也是等价的:

(a*ba*ba*b)*a*
a*(ba*ba*ba*)*

如果你想强迫至少3个小时,你必须从Kleene明星那里拿出b:#/ p>

(a|b)*b(a|b)*b(a|b)*b(a|b)*

答案 2 :(得分:1)

您应该在小组后使用+而不是*,否则会接受空字符串:

(a*ba*ba*ba*)+

虽然这只允许3的倍数。如果你想要至少3和任意数量的额外,它将是:

a*ba*ba*b(a|b)*

这适用于这些要求。但这不是一个好方法。在你的例子中,你正在搜索“a”和“b”,它们是单个字符模式,在我看来,对于简单的规则“有3个b”,它已经是一个不合理的长表达式。但如果模式更复杂呢?你需要重复它们至少3次,使它更加笨拙。

如果规则略有变化怎么办?如果你想匹配最大而不是最小 b的数量,那么它将变得更加复杂/重复,因为你唯一的选择是将每个模式组合起来可能的数字(1,2,3):

(a*ba*|a*ba*ba*|a*ba*ba*ba*)

或者,如果你决定这个词必须是一定的长度,那么实际上就变得不可能了,没有列出每个排列(对于一个7个字母的单词ba{3}baba{2}bababb{3}a{4}等等)。

因此,我认为解决此问题的更好方法是匹配基本通用模式,然后检查匹配的结果以检查计数。例如,只需匹配“单词”:

(a|b)+

然后在匹配的文本上,匹配b:

b

并根据需要测试匹配数和/或文本长度。每个模式最多只重复两次,您的代码可以很容易地适应不同的要求。