0

{a,b,c}アルファベットにしましょう。このアルファベットの入力に一致する正規表現を作成する必要があります。aa入力に表示される場合は、 cc(入力のどこかに)表示される必要があります。

数量詞+および*を使用し、括弧でグループ化し、。で代替を使用するだけで、先読み、後戻り、後参照はありません|

問題は、これにアプローチする方法がわからないことです。たとえば、これらの入力は一致する必要があります。

  • アバ
  • bccb
  • bccaa
  • ""(空の入力)
  • bccbaa
  • ccbaabb

以下は一致してはなりません:

  • aa
  • abaaab
  • baaa
  • caac

これらのツールのみを使用して、このような正規表現を作成するにはどうすればよいですか?

アップデート

私は考えました

((cc(b|c)*aa)|(aa(b|c)*cc))+|(ab|ba|ca|ca|bb|bc|cc)*

あなたはどう思いますか、これは仕様を満たしていますか?

4

2 に答える 2

3
(b|c|a(b|c))*(a|)|(a|b|c)*(aa(a|b|c)*cc|cc(a|b|c)*aa)(a|b|c)*

一致します:

  • 任意の数のbsまたはcs(ゼロでも)、またはaifの後にabまたはc、が続き、最後にオプションの伴奏なしa。これらのルールを組み合わせることで、2つのsが常にaまたはでa区切られ、空の文字列と単一の文字にも一致するようになります。bc
  • どこかにaaを含み、最終的にccが続く文字列
  • どこかにccが含まれ、その後にaaが続く文字列

(参考までに、それぞれaaをと一致させる必要があるcc場合は、ちょっと困惑しています。これはもはや規則的ではありません。のような文字列では、これまでに表示されたsのccccaaaa数をカウントする必要がありcc、FSAはカウントできません。)

于 2012-12-03T15:11:44.783 に答える
2

与えられたパラメータのセットにとって、それはそれほど些細なことではないと思います。

/^((b|c|ab|ac|a$)*|(a|b|c)*(cc(a|b|c)*aa|aa(a|b|c)*cc)(a|b|c)*)$/;

説明:明らかに、ここでは3つのケースに一致する必要があります。

  • 文字列全体に「aa」シーケンスが含まれていません。この状態は、次のパターンで表されます。

/^(b|c|ab|ac|a$)*$/

...つまり、「文字列の最後にある記号、、シーケンスb、または単一の項目の任意の組み合わせの任意の数に一致します」。cabaca

  • 文字列全体には「aa」シーケンスが含まれ、その後に(どこかで)「cc」シーケンスが続きます-それでも[abc]範囲のみで構成されます:

    /^(a|b|c)* aa(a|b|c)* cc(a|b|c)* $/

(空白*がない場合は、セクション内でも斜体のテキストマーカーとして扱われ<code>ます。明らかに、正規表現では必要ありません)

  • 文字列全体には、「cc」シーケンスが(どこかに)先行する「aa」シーケンスが含まれていますが、それでも[abc]範囲のみで構成されています。

    /^(a|b|c)* cc(a|b|c)* aa(a|b|c)* $/

これで、正規表現の3つの部分ができました。これを単純なパターンに組み合わせるのは、非常に簡単だと思います。

于 2012-12-03T14:36:07.153 に答える