我在解决问题时遇到问题: - 它是一个任务,我解决了它,但它似乎太长而模糊,可以任何人帮助我......
具有偶数个a和奇数个b的字符串的正则表达式,其中字符集= {a,b}。
答案 0 :(得分:19)
执行此操作的一种方法是通过两个正则表达式传递它,确保它们都匹配(假设您想要使用正则表达式,请参阅下面的替代方法):
^b*(ab*ab*)*$
^a*ba*(ba*ba*)*$
其他任何东西(事实上,甚至是那个)很可能只是一种聪明的尝试,通常是一次大规模的失败。
第一个正则表达式确保混合中的任何位置都有a
b
偶数(之前,之后和之间)。
第二个是类似的,但由于起始b
,确保{em>奇数的a*ba*
个数。
远远更好的方法是完全忽略正则表达式,只需按如下方式运行字符串:
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的一篇论文。有关实际的内部工作原理,请参阅here。
答案 1 :(得分:3)
Even-Even = (aa+bb+(ab+ba)(aa+bb)*(ab+ba))*
(偶数偶数的Aas和b的偶数都相等)
a的偶数b =偶数b偶数
这应该可行
答案 2 :(得分:1)
(bb)*a(aa)*ab(bb)*
ab(bb)* a(aa)*
b(aa)*(bb)*
。可能有很多这样的正则表达式。你还有其他任何条件,比如“以a开头”或类似的东西(奇怪的'b'甚至'a'除外)?
答案 3 :(得分:0)
我会这样做:
甚至 - > ( a ( bb )* a ( bb )* | a b ( bb )* a b ( bb )*)
奇数 - > ( a b ( bb )* a ( bb )* | a ( bb )* a b ( bb )*)
偶数个 a 的字符串和 b 的奇数:
请注意,偶数不会影响字符串中 a / b 的均匀度/奇数。
正则表达式 - > (
b ( bb )* 偶数* (奇数 偶数* < strong>奇数)* 偶数*
|
( bb )* 偶数* 奇数 偶数* (奇数 <强>偶* 奇数)* 偶*
)
当然,可以在最终的正则表达式中替换偶数和奇数的每一个出现以获得单个正则表达式。
很容易看出满足这个正则表达式的字符串确实会有偶数个 a (因为符号 a 只出现在偶数< / strong>和奇数子目标,并且每个都使用正好两个 a 的)和奇数个 b (第一种情况: 1 b +偶数 b 's偶数奇数;第二种情况:偶数 b 's +奇数奇数)。
具有偶数 a 和奇数 b 的字符串将满足此正则表达式,因为它以零或更多 b开头,然后是[one a ,零个或多个 b ,另外一个 a ,零个或多个 b 的],零次或多次。
答案 4 :(得分:0)
高级建议:为语言构建一个确定性有限自动机---非常简单,编码状态中a
和b
s的奇偶校验,{{1编码甚至nr。 q0
s甚至nr。 a
s,并相应地转换---,然后将DFA转换为正则表达式(通过使用众所周知的算法或#34;从头开始&#34;)。
这里的想法是利用DFA(常规语言的算法描述)和正则表达式(常规语言的代数描述)之间易于理解的等价。
答案 5 :(得分:0)
这个正则表达式使用偶数a和偶数b的所有字符串
r1=((ab+ba)(aa+bb)*(ab+ba)+(aa+bb))*
现在获得偶数和奇数b的正则表达式
r2=(b+a(aa+bb)*(ab+ba))((ab+ba)(aa+bb)*(ab+ba)+(aa+bb))*
答案 6 :(得分:0)
正则表达式如下:
tot = result + tot;
答案 7 :(得分:0)
对于a和b的偶数,我们有正则表达式:
E = { (ab + ba) (aa+bb)* (ab+ba) }*
对于a
的偶数和b
的奇数,我们要做的就是在上述表达式b
中添加一个额外的E
所需的正则表达式为:
E = { ((ab + ba) (aa+bb)* (ab+ba))* b ((ab + ba) (aa+bb)* (ab+ba))* }
答案 8 :(得分:0)
的结构化的方式来做到这一点是使一个转换图,并从它建立正则表达式。 这种情况下的正则表达式将是
(a((b(aa)*b)*a+b(aa)*ab)+b((a(bb)*a)*b+a(bb)*ba))b(a(bb)*a)*
看起来比较复杂,但它涵盖可能出现的所有可能的情况。
答案 9 :(得分:-1)
答案是(aa + ab + ba + bb)* b(aa + ab + ba + bb)*
答案 10 :(得分:-1)
(bb)* b(aa)* +(aa)* b(bb)*
这是处理所有类型字符串的答案,其中包含奇数b甚至是a。
答案 11 :(得分:-2)
如果是a的偶数,则后跟奇数个b (aa)* b(bb)*应该起作用
如果是任何顺序 (aa)* b(bb)* + b(bb)(aa)应该有效
答案 12 :(得分:-2)
所有字符串甚至没有b的奇数和奇数 (((aa + bb)* b(aa + bb)*)+(A +((a + b)b(a + b))*))*
这里A代表空字符串。 A可以忽略不计。
如果有任何错误,请将其指出。