3

言語 {0,1} のすべてを受け入れるが、部分文字列 110 または 101 を含まない正規表現は何ですか?

承認:

  • 111111
  • 000011111
  • 100001000001001
  • 010
  • 1

拒絶:

  • 100110
  • 010100
  • 123

編集:以下の回答に関するコメントによると、この質問は正式な正規表現を求めています。

4

6 に答える 6

11

これが解決策です(先読みがなくても):

/^0*(11*$|10$|100+)*$/
  • 任意の数のゼロから始めます。
  • ループ(知っている:これまでに解析された文字列は「1」または「10」で終わらない)
    • 「1$」は大丈夫です(&stop)
    • 「11」を見つけたら、最後まで読めない
    • 「10$」は大丈夫です。
    • 「10」を読んで続行したい場合は、1つ以上のゼロを読んでください。次に、ループに戻ります。
于 2009-11-08T15:08:55.870 に答える
6

一致しないかどうかを確認するのが最善です/101|110/

于 2009-11-08T14:45:19.957 に答える
4

正規表現エンジンが先読みをサポートしていると仮定すると、これはうまくいくようです。

/^(1(?!01|10)|0)*$/
于 2009-11-08T15:01:24.403 に答える
3

正式な正規表現表記に限定:

((1|0*|0*1)(000*))*0*(10*|1*)
于 2009-11-09T16:33:28.213 に答える
-1

これはうまくいくはずです:

/^([01])\1*$/
于 2009-11-08T14:46:24.713 に答える
-1

対応する DFA は簡単に描画できます。

受け入れられた「正式な」正規表現構文によって制限されている場合、対応する有限サイズの正規表現はありません (完全な代数で必要な「and」、「xor」、「not」などの単純な演算子の欠如)。

しかし、このような多くの解決策があります

(0|100|(1|10|11*)$)*

所有格マッチングでも解決できます。(111+$) は 111++

于 2010-12-30T21:54:12.993 に答える