2012-03-28 6 views
0

a,bおよびcの文字列の正規表現を作成する方法aabbは拒否されますか?連続していない文字と一致する正規表現を作成するにはどうすればよいですか?

たとえば、abcabccababcccccabが受け入れられ、aaabcまたはaaabbccccまたはabcccababaaは拒否されます。

+1

'aa'と' bb'を検索して、あなたの意思決定を逆転する方が簡単です。 – hochl

+1

ところで、この宿題はありますか? – Kaz

答えて

0

&演算子(交差点)と〜(補数)の使用:これらの演算子なしでこれを書き換え

(a|b|c)*&~(.*(aa|cc).*) 

は注意が必要です。通常の方法は、ケースに分割することです。

この場合、それほど難しいことではありません。

文字「c」が画像から取り出されたとします。 aabbを持っていないだけのシーケンスは以下のとおりです。私たちは何ができるか

e (empty string) 
a 
b 
b?(ab)*a? 

次は、すべての可能な内部の場所にいくつかのオプションの「C」に実行を挿入です:

e (empty string) 
a 
b 
(bc*)?(ac*bc*)*a? 

次に、我々たとえば、acacbcbc'. We allow a finaland b . This pattern can take care of our loneand b`の場合と同様に、非オプションの 'c'の実行が中央に置かれた場合、aabbのような不正なシーケンスが受け入れられることを認識する必要があります。

その後
(ac+|bc+)*(a|b)? 

それらを互いに結合:

((ac+|bc+)*(a|b)?|(bc*)?(ac*bc*)*a?|(ac+|bc+)(a|b)?) 

我々はほとんどあります。私たちも、このパターンは、任意の回数だけ発生する可能性があることを認識する必要がある限り、C'-S」が分裂しているよう発生箇所の間、および任意の先導でまたは全部

c*((ac+|bc+)*(a|b)?|(bc*)?(ac*bc*)*a?|(ac+|bc+)(a|b)?)(c+((ac+|bc+)*(a|b)?|(bc*)?(ac*bc*)*a?|(ac+|bc+)(a|b)?))*c* 

氏のRegex Philbin周りc -sのランを末尾に、私はこれを処理しないことを任意の例を考え出すていないよ、私は」それをそのまま残す私の最終的な答え。これはあなたが単にaabbを検索し、例えば、あなたのロジックを否定することができ、純粋に学問質問されていない場合

4

s='abcccabaa' 
# continue if string does not match. 
if re.search('(?:aa|bb)', s) is None: 
    ... 

を、または単に二つのパターンの文字列をスキャンするには、は高価な正規表現を避けます:REはおそらく総やり過ぎである、このような簡単な作業のために

if 'aa' not in s and 'bb' not in s: 
    ... 

P .:例はPythonで書かれていますが、その原則は他の言語にも当てはまります。

+0

+1正規表現以外のソリューションを提案する。文字列スキャンのソリューションははるかに理解しやすく、かなり高速になる可能性があります。 –

+0

はい、REを使用しないオプションは、しばしば考慮されません。イオン勉強の質問は、より速いものがある場合です。 – hochl

+0

コンパイルされた正規表現は、必要とされるバックトラックの量に応じて、思ったよりも速いことがよくあります。文字列演算の束を1つの正規表現で置き換えることができ、正規表現を何かのためにバックトラックする必要がなければ、正規表現は実際には文字列演算よりも*高速です。 –

0
^(?!.*(?:aa|bb))[abc]+$ 

この正規表現は、二つのこと

  1. は、あなたの文字列のみから成る、b、cの
  2. はAAとBB
に失敗していることを確認するだろう、それを here on Regexr

を参照してください。

^は、スターと一致しますAAまたはBBはストリング

[abc]+character classに存在する場合、文字列

(?!.*(?:aa|bb))negative lookahead assertionのtは、失敗し、可能にのみ、B、Cの少なくとも一つ(+

$は終了と一致文字列の内容

+0

私はこれをPerl Cruftが正規表現とみなすとは思わない。 – Kaz

+0

どうしてそう思う?これは完全に有効なperlの正規表現です。多分あなたはperl正規表現の現代的なパワーを見てみるべきです:[perlretut](http://perldoc.perl.org/perlretut.html)。 – stema

関連する問題