具有偶数a和奇数no的字符串的正则表达式

Abu*_*hew 14 string language-theory regular-language

我在解决这个问题时遇到了问题: - 它是一个任务,我解决了它,但它看起来太长而且模糊,可以帮助我,请帮助我......

具有偶数个a和奇数个b的字符串的正则表达式,其中字符集= {a,b}.

pax*_*blo 19

一种方法是将它传递给两个正则表达式,确保它们都匹配(假设您想要使用正则表达式,请参阅下面的替代方法):

^b*(ab*ab*)*$
^a*ba*(ba*ba*)*$
Run Code Online (Sandbox Code Playgroud)

其他任何东西(事实上,甚至是那个)很可能只是一种聪明的尝试,一般来说是一次大规模的失败.

第一正则表达式可确保有偶数个ab在混合(之前,之后和在它们之间)的任何地方.

第二个是类似的,但可以确保有一个奇数编号的b借助于起动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
Run Code Online (Sandbox Code Playgroud)

虽然正则表达式是一个很好的工具,但它们并不适合所有东西,因为它们的可读性和可维护性降低,它们变得不那么有用了.


对于它的价值,单正则表达式的答案是:

(aa|bb|(ab|ba)(aa|bb)*(ba|ab))*(b|(ab|ba)(bb|aa)*a)
Run Code Online (Sandbox Code Playgroud)

但是,如果我发现团队中的任何人实际上使用了这样的怪物,他们会被送回去再做一次.

这来自Greg Bacon的一篇论文.请参阅此处了解实际的内部工作原理.


小智 5

Even-Even = (aa+bb+(ab+ba)(aa+bb)*(ab+ba))*
Run Code Online (Sandbox Code Playgroud)

(Even-Even 有偶数个 Aas 和 b 两个)

偶数 a 和奇数 b = Even-Even b Even-Even

这应该有效