私は問題を解決するのに問題を抱えています:-それは課題です、私はそれを解決しましたが、それは長すぎて漠然としているようです、私を助けてください...
Aが偶数でbが奇数の文字列の正規表現。ここで、文字セット= {a、b}です。
これを行う1つの方法は、two正規表現を通過させて、両方が一致することを確認することです(正規表現を使用したい場合、以下を参照してください)。代替):
^b*(ab*ab*)*$
^a*ba*(ba*ba*)*$
それ以外の場合(実際にはそれも)は、おそらく大胆な失敗である巧妙な試みである可能性が高いです。
最初の正規表現では、a
とb
が偶数で混在している場所(前、後、およびその間)が偶数であることを確認しています。
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による論文からのものです。実際の内部動作については こちら を参照してください。
Even-Even = (aa+bb+(ab+ba)(aa+bb)*(ab+ba))*
(偶数にも偶数のAasとbの両方があります)
偶数aと奇数bの=偶数偶数b偶数偶数
このすごい仕事
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))* }
(bb)*a(aa)*ab(bb)*
_ab(bb)* a(aa)*
b(aa)*(bb)*
。そのような正規表現はたくさんあります。 「で始まる」などの条件(奇妙な「b」や「a」以外)はありますか?
それを行う構造化された方法は、1つの遷移図を作成し、それから正規表現を構築することです。この場合の正規表現は
(a((b(aa)*b)*a+b(aa)*ab)+b((a(bb)*a)*b+a(bb)*ba))b(a(bb)*a)*
複雑に見えますが、発生する可能性のあるすべてのケースをカバーしています。
この正規表現は、偶数の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))*
正規表現は次のとおりです。
(aa|bb)*((ab|ba)(aa|bb)*(ab|ba)(aa|bb)*b)*
高レベルのアドバイス:言語の決定論的有限オートマトンを作成します---非常に簡単で、a
sとb
sの数のパリティをq0
エンコーディングでエンコードしますさえnr。 a
s、さらにはnr。のb
sとそれに応じて遷移---し、DFAを正規表現に変換します(このためのよく知られたアルゴリズムを使用するか、「最初から」)。
ここでの考え方は、DFA(正規言語のアルゴリズムによる記述)と正規表現(正規言語の代数による記述)の間でよく理解されている同等性を利用することです。
私は次のようにします:
偶数->(a(bb)*a(bb)* |ab(bb)*ab(bb)*)
奇数->(ab(bb)*a(bb)* |a(bb)*ab(bb)*)
aの偶数とbの奇数の文字列:
evenは、a/bの偶数/奇数に影響を与えないことに注意してください。文字列。
正規表現->(
b(bb)* even *(奇数偶数*奇数)* 偶数*
|
(bb)* even *oddeven *(odd = 偶数*奇数)* 偶数*
)
もちろん、最終的な正規表現でevenとoddをすべて置き換えて、単一の正規表現を取得できます。
この正規表現を満たす文字列が実際にaの偶数を持っていることが簡単にわかります(記号aが発生するため) evenおよびoddサブ正規表現のみで、これらはそれぞれ2つa 's)と奇数(bの(最初のケース:1b+偶数のbの+偶数奇数; 2番目のケース:bの偶数+奇数奇数)。
aの偶数とbの奇数の文字列は、この正規表現がゼロ以上bの後に、[onea、ゼロ以上bが続きますの1回以上aおよび0回以上b 's]、0回以上。