2017-09-14 11 views
3

最近、私は正規表現を試しています。さて、私は3つのシンボルa、b、cを持っています。2つの連続したaとbを持たない正規表現

私は最初に2つの連続したaを必要としない場合を見ました。

無二つの連続するAさんと無二つの連続したBさんとの定期的な表現:ような何かを言うために、この問題を一般化する方法があるかどう

((b|c + a(b|c))*(a + epsilon) 

は、今私は思ったんだけど:正規表現は次のようなものになるだろう。私のようなものを試してみました:

(a(b|c) + b(a|c) + c)* (a + b + epsilon) 

しかし、これは私が欲しいものではありません、このような2連続でAさん(またはBの)を持っているだろう「アバ」または「BAAB」などの入力を受け付けます。誰も私に方法を提案することはできますか?

答えて

3

否定一致を実行できない場合は、負の先読みを使用してaabbに一致する文字列を除外できますか?以下のような何か(詳細についてはRegex 101を参照してください):

(?!.*(aa|bb).*)^.*$ 
+1

:1「」

チェックこのページになります。ネガティブな先読みはそのトリックを行います。私はこの答えを受け入れています。 – paratrooper

2

私は(私が思う)FSM2Regexを使用して正規表現を生成し、その後、手描き有限状態マシンをすることによってこれを解決しました。ステートマシンは、(サイトからの構文で)下に書かれている:

#states 
s0 
s1 
s2 
s3 
#initial 
s0 
#accepting 
s1 
s2 
s3 
#alphabet 
a 
b 
c 
#transitions 
s0:a>s1 
s0:b>s2 
s0:c>s3 
s1:b>s2 
s1:c>s3 
s2:a>s1 
s2:c>s3 
s3:c>s3 
s3:a>s1 
s3:b>s2 

enter image description here

あなたがトランジションを見れば、あなたはそれが私が」に対応して状態を持つかなりstraightforward-だわかりますシンク "のアルファベットのそれぞれの文字のために、私は他の文字("シンク "レターではない)のためのその状態からの移行を許可します。たとえば、s1aの「シンク」です。その他の州では、s1にはaが表示されます。 s1に入った後は、bまたはcで出ることができます。とs3のそれぞれの "シンク"を持っています。 cを繰り返すことができるので、は、文字cでそれ自身に遷移します。ブロックテキストをサイトに貼り付けると、これがすべてあなたのために描画され、正規表現が生成されます。

それは私のために生成された正規表現は次のとおりです。私はかなり確信している、

c+cc*(c+$+b+a)+(b+cc*b)(cc*b)*(c+cc*(c+$+b+a)+$+a)+(a+cc*a+(b+cc*b)(cc*b)*(a+cc*a))(cc*a+(b+cc*b)(cc*b)*(a+cc*a))*(c+cc*(c+$+b+a)+(b+cc*b)(cc*b)*(c+cc*(c+$+b+a)+$+a)+b+$)+b+a 

、最適な:)

EDITではありません:生成された正規表現は選択演算子(通常知られているよう+を使用しています私たちにコーダーに|として)、それはおそらくコードに貼り付けるのに適していないことを意味します。しかし、私はそれと私の正規表現を台無しにリスクを変更するにはあまりにも怖い:)

0

あなたは前の文字に一致するように参照をバックに使用できる

string input = "acbbaacbba"; 
string pattern = @"([ab])\1"; 
var matchList = Regex.Matches(input, pattern); 

このパターンは一致します:BB、AAとBBを。あなたの入力パターンに一致するものがない場合は、繰り返しaまたはbが含まれていないことを意味します。

説明:

([AB]):グループを定義し、あなたがここにあなたのシンボルを拡張することができ

\ 1:バックは、グループを参照するので、例えば、 '' マッチングされ、\これは確かに素晴らしいアイデアのように見えるhttp://www.regular-expressions.info/backref.html

関連する問題