a
,b
およびc
の文字列の正規表現を作成する方法aa
とbb
は拒否されますか?連続していない文字と一致する正規表現を作成するにはどうすればよいですか?
たとえば、abcabccababcccccab
が受け入れられ、aaabc
またはaaabbcccc
またはabcccababaa
は拒否されます。
a
,b
およびc
の文字列の正規表現を作成する方法aa
とbb
は拒否されますか?連続していない文字と一致する正規表現を作成するにはどうすればよいですか?
たとえば、abcabccababcccccab
が受け入れられ、aaabc
またはaaabbcccc
またはabcccababaa
は拒否されます。
&演算子(交差点)と〜(補数)の使用:これらの演算子なしでこれを書き換え
(a|b|c)*&~(.*(aa|cc).*)
は注意が必要です。通常の方法は、ケースに分割することです。
この場合、それほど難しいことではありません。
文字「c
」が画像から取り出されたとします。 aa
とbb
を持っていないだけのシーケンスは以下のとおりです。私たちは何ができるか
e (empty string)
a
b
b?(ab)*a?
次は、すべての可能な内部の場所にいくつかのオプションの「C」に実行を挿入です:
e (empty string)
a
b
(bc*)?(ac*bc*)*a?
次に、我々たとえば、acacbcbc'. We allow a final
and
b . This pattern can take care of our lone
and
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のランを末尾に、私はこれを処理しないことを任意の例を考え出すていないよ、私は」それをそのまま残す私の最終的な答え。これはあなたが単にaa
とbb
を検索し、例えば、あなたのロジックを否定することができ、純粋に学問質問されていない場合
:
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で書かれていますが、その原則は他の言語にも当てはまります。
+1正規表現以外のソリューションを提案する。文字列スキャンのソリューションははるかに理解しやすく、かなり高速になる可能性があります。 –
はい、REを使用しないオプションは、しばしば考慮されません。イオン勉強の質問は、より速いものがある場合です。 – hochl
コンパイルされた正規表現は、必要とされるバックトラックの量に応じて、思ったよりも速いことがよくあります。文字列演算の束を1つの正規表現で置き換えることができ、正規表現を何かのためにバックトラックする必要がなければ、正規表現は実際には文字列演算よりも*高速です。 –
^(?!.*(?:aa|bb))[abc]+$
この正規表現は、二つのこと
を参照してください。
^
は、スターと一致しますAAまたはBBはストリング
[abc]+
character classに存在する場合、文字列
(?!.*(?:aa|bb))
negative lookahead assertionのtは、失敗し、可能にのみ、B、Cの少なくとも一つ(+
)
$
は終了と一致文字列の内容
'aa'と' bb'を検索して、あなたの意思決定を逆転する方が簡単です。 – hochl
ところで、この宿題はありますか? – Kaz