17

私は問題を解決するのに問題があります:- それは課題です, 私はそれを解決しました, しかし、それは長すぎて漠然としているようです. 誰か助けてください.

a が偶数個、b が奇数個で、文字セットが {a,b} の文字列の正規表現。

4

13 に答える 13

21

これを行う 1 つの方法は、 2 つの正規表現に渡して、両方が一致することを確認することです (正規表現を使用したい場合は、別の方法について以下を参照してください)。

^b*(ab*ab*)*$
^a*ba*(ba*ba*)*$

それ以外のことは (実際、それさえも) 賢くしようとする試みであり、一般的には大失敗です。

最初の正規表現は、ミックス内の任意の場所 (前、後、およびその間) に偶数のawithがあることを保証します。b

2 番目は似ていますが、先頭のによって が奇数になるようにします。ba*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)

しかし、私のチームの誰かが実際にそのような怪物を使用しているのを見つけた場合、彼らは再び送り返されます.

これはあるグレッグ・ベーコンの論文から来ています。実際の内部動作については、こちらを参照してください。

于 2010-09-13T07:59:49.157 に答える
1
  1. (bb)*a(aa)*ab(bb)*
  2. ab(bb)* a(aa)*
  3. b(aa)*(bb)* .
    .
    .
    .
    .
    .

そのような正規表現はたくさんあります。「a で始まる」またはそのようなもの (奇数の 'b' と偶数の 'a' 以外) のような他の条件はありますか?

于 2010-09-13T08:00:44.367 に答える
-1

(bb)* b (aa)* + (aa)* b (bb)*

これは、奇数の b と偶数の a を持つすべての種類の文字列を処理する答えです。

于 2016-02-25T09:41:44.430 に答える
-1

答えは (aa+ab+ba+bb)* b (aa+ab+ba+bb)*

于 2014-11-30T12:07:41.200 に答える
-2

偶数の a の後に奇数の b が続く場合 (aa)*b(bb)* が機能するはずです

任意の順序であれば (aa)*b(bb)* + b(bb) (aa)が機能するはずです

于 2016-12-18T03:51:12.000 に答える