web-dev-qa-db-ja.com

aが偶数でbが奇数でない文字列の正規表現

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

Aが偶数でbが奇数の文字列の正規表現。ここで、文字セット= {a、b}です。

14
Abu Mathew

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

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

それ以外の場合(実際にはそれも)は、おそらく大胆な失敗である巧妙な試みである可能性が高いです。

最初の正規表現では、abが偶数で混在している場所(前、後、およびその間)が偶数であることを確認しています。

2番目も同様ですが、開始a*ba*により、oddの数がbになるようにします。


これを行うはるかにbetter方法は、正規表現をすべて無視し、次のように文字列を単純に実行することです。

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)

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

これは、1人のGreg Baconによる論文からのものです。実際の内部動作については こちら を参照してください。

19
paxdiablo
Even-Even = (aa+bb+(ab+ba)(aa+bb)*(ab+ba))*

(偶数にも偶数のAasとbの両方があります)

偶数aと奇数bの=偶数偶数b偶数偶数

このすごい仕事

3
Veenu

Aとbが偶数の場合、次の正規表現があります。

E = { (ab + ba) (aa+bb)* (ab+ba) }*

aが偶数でbが奇数の場合、必要なのは、上記の式bEを追加することだけです。

必要な正規表現は次のとおりです。

E = { ((ab + ba) (aa+bb)* (ab+ba))* b ((ab + ba) (aa+bb)* (ab+ba))* }
1
Abhinav Rastogi
  1. _(bb)*a(aa)*ab(bb)*_
  2. ab(bb)* a(aa)*
  3. b(aa)*(bb)*




そのような正規表現はたくさんあります。 「で始まる」などの条件(奇妙な「b」や「a」以外)はありますか?

1
vandanak

それを行う構造化された方法は、1つの遷移図を作成し、それから正規表現を構築することです。この場合の正規表現は

(a((b(aa)*b)*a+b(aa)*ab)+b((a(bb)*a)*b+a(bb)*ba))b(a(bb)*a)*

複雑に見えますが、発生する可能性のあるすべてのケースをカバーしています。

0
Ricky

この正規表現は、偶数のaと偶数のbを持つすべての文字列を取ります。

r1=((ab+ba)(aa+bb)*(ab+ba)+(aa+bb))*

偶数aと奇数bの正規表現を取得する

r2=(b+a(aa+bb)*(ab+ba))((ab+ba)(aa+bb)*(ab+ba)+(aa+bb))*
0
Pooja Consul

正規表現は次のとおりです。

    (aa|bb)*((ab|ba)(aa|bb)*(ab|ba)(aa|bb)*b)*
0
rashedcs

高レベルのアドバイス:言語の決定論的有限オートマトンを作成します---非常に簡単で、asとbsの数のパリティをq0エンコーディングでエンコードしますさえnr。 as、さらにはnr。のbsとそれに応じて遷移---し、DFAを正規表現に変換します(このためのよく知られたアルゴリズムを使用するか、「最初から」)。

ここでの考え方は、DFA(正規言語のアルゴリズムによる記述)と正規表現(正規言語の代数による記述)の間でよく理解されている同等性を利用することです。

0
blazs

私は次のようにします:

  • regex evenは、記号a、次にbのシーケンス、記号a再び、bの別のシーケンス。bの偶数があるようにの:

偶数->(abb)*abb)* |abbb)*abbb)*)

  • 正規表現oddは、奇数の総数bで同じことを行います。

奇数->(abbb)*abb)* |abb)*abbb)*)

aの偶数とbの奇数の文字列:

  • bの奇数で始まり、その後にevenパターンの中で偶数のoddパターンが続きます。
  • または、偶数のbで始まり、奇数のoddパターンの中でevenパターンが続く。

evenは、a/bの偶数/奇数に影響を与えないことに注意してください。文字列。

正規表現->(

bbb)* even *奇数偶数*奇数)* 偶数*

|

bb)* even *oddeven *odd = 偶数*奇数)* 偶数*

もちろん、最終的な正規表現でevenoddをすべて置き換えて、単一の正規表現を取得できます。

この正規表現を満たす文字列が実際にaの偶数を持っていることが簡単にわかります(記号aが発生するため) evenおよびoddサブ正規表現のみで、これらはそれぞれ2つa 's)と奇数(bの(最初のケース:1b+偶数のbの+偶数奇数; 2番目のケース:bの偶数+奇数奇数)。

aの偶数とbの奇数の文字列は、この正規表現がゼロ以上bの後に、[onea、ゼロ以上bが続きますの1回以上aおよび0回以上b 's]、0回以上。

0
Fabian Pijcke