我在解决这个问题时遇到麻烦:- 这是一个任务,我已经解决了它,但似乎太长而且含义模糊,请问有人能帮忙吗......
匹配由字符集{a, b}组成的偶数个a和奇数个b的字符串的正则表达式。
我在解决这个问题时遇到麻烦:- 这是一个任务,我已经解决了它,但似乎太长而且含义模糊,请问有人能帮忙吗......
匹配由字符集{a, b}组成的偶数个a和奇数个b的字符串的正则表达式。
其中一种方法是将其通过两个正则表达式,确保它们都匹配(假设您确实想要使用正则表达式,请参见下面的替代方案):
^b*(ab*ab*)*$
^a*ba*(ba*ba*)*$
除此以外的任何东西(实际上,即使是这样)都很可能只是试图聪明,但通常是巨大的失败。
第一个正则表达式确保在混合物中(之前、之后和之间),a
和 b
的数量是偶数。
第二个也类似,但通过起始的 a*ba*
确保 b
的数量是奇数。
一个远更好的方法是完全忽略正则表达式,并按以下方式遍历字符串:
def isValid(s):
set evenA to true
set oddB to false
for c as each character in s:
if c is 'a':
set evenA to not evenA
else if c is 'b':
set oddB to not oddB
else:
return false
return evenA and oddB
虽然正则表达式是一个很棒的工具,但并不适用于所有情况。当其可读性和可维护性降低时,它们的效用也会大大降低。
值得一提的是,单个正则表达式的答案为:
(aa|bb|(ab|ba)(aa|bb)*(ba|ab))*(b|(ab|ba)(bb|aa)*a)
但是,如果我发现我的团队中有人实际上使用像那样的丑陋东西,他们将被送回去重新做。
这句话来自Greg Bacon的一篇论文。请参见这里获取实际的内部工作原理。
Even-Even = (aa+bb+(ab+ba)(aa+bb)*(ab+ba))*
(Even-Even包含偶数个a和b)
偶数个a和奇数个b = Even-Even b Even-Even
这应该可以工作
这个正则表达式匹配所有包含偶数个a和偶数个b的字符串。
r1=((ab+ba)(aa+bb)*(ab+ba)+(aa+bb))*
r2=(b+a(aa+bb)*(ab+ba))((ab+ba)(aa+bb)*(ab+ba)+(aa+bb))*
(bb)*a(aa)*ab(bb)*
ab(bb)* a(aa)*
b(aa)*(bb)*
.可能会有许多这样的正则表达式。您是否有任何其他条件,例如“以a开头”或类似条件(除了奇数个'b'和偶数个'a')?
对于a和b的数量均为偶数,我们有正则表达式:
E = { (ab + ba) (aa+bb)* (ab+ba) }*
a
和奇数个b
,我们只需要在上面的表达式E
中添加一个额外的b
即可。E = { ((ab + ba) (aa+bb)* (ab+ba))* b ((ab + ba) (aa+bb)* (ab+ba))* }
我会按照以下方式进行:
even -> (a (bb)* a (bb)* | a b (bb)* a b (bb)*)
odd -> (a b (bb)* a (bb)* | a (bb)* a b (bb)*)
一个由偶数个a和奇数个b组成的字符串,要么:
请注意,偶数对于字符串中a/b的奇偶性没有影响。
正则表达式 -> (
b (bb)* even* (odd even* odd)* even*
|
(bb)* even* odd even* (odd even* odd)* even*
(bb)*偶数奇数偶数(奇数偶数奇数)*偶数
)
当然,可以在最终的正则表达式中替换每个even和odd的出现次数,以获得单个正则表达式。
很容易看出,满足此正则表达式的字符串确实具有偶数个a(因为符号a仅出现在even和odd子正则表达式中,并且这些子正则表达式各使用了两个a),以及奇数个b(第一种情况:1个b+偶数个b+偶数个odd;第二种情况:偶数个b+奇数个odd)。
具有偶数个a和奇数个b的字符串将满足此正则表达式,因为它以零个或多个b开头,然后是[一个a,零个或多个b,再加上一个a和零个或多个b],重复零次或多次。
以下是正则表达式:
(aa|bb)*((ab|ba)(aa|bb)*(ab|ba)(aa|bb)*b)*
结构化的方法是制作一个转换图并从中构建正则表达式。 在这种情况下,正则表达式将是
(a((b(aa)*b)*a+b(aa)*ab)+b((a(bb)*a)*b+a(bb)*ba))b(a(bb)*a)*
看起来很复杂,但它涵盖了可能出现的所有情况。