我觉得这很模糊和模糊,我很想理解
我有这些字符串
abbb
bbb
aaaabaaabaaabaaabaaabaaab
babba
bbbaaaa
aaaaabbaba
它们都有效,因为包含多个b
,然后我使用:
(a*ba*ba*ba*)*
这与所有人匹配(a*ba*ba*b)*a*
这一切也与他们匹配a*(ba*ba*ba*)*
与上述相同这些真的都一样吗?还是有一些我没有看到的边缘情况?
答案 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}bab
,a{2}babab
,b{3}a{4}
等等)。
因此,我认为解决此问题的更好方法是匹配基本通用模式,然后检查匹配的结果以检查计数。例如,只需匹配“单词”:
(a|b)+
然后在匹配的文本上,匹配b:
b
并根据需要测试匹配数和/或文本长度。每个模式最多只重复两次,您的代码可以很容易地适应不同的要求。