言語 {0,1} のすべてを受け入れるが、部分文字列 110 または 101 を含まない正規表現は何ですか?
承認:
- 111111
- 000011111
- 100001000001001
- 010
- 1
拒絶:
- 100110
- 010100
- 123
編集:以下の回答に関するコメントによると、この質問は正式な正規表現を求めています。
これが解決策です(先読みがなくても):
/^0*(11*$|10$|100+)*$/
一致しないかどうかを確認するのが最善です/101|110/
正規表現エンジンが先読みをサポートしていると仮定すると、これはうまくいくようです。
/^(1(?!01|10)|0)*$/
正式な正規表現表記に限定:
((1|0*|0*1)(000*))*0*(10*|1*)
これはうまくいくはずです:
/^([01])\1*$/
対応する DFA は簡単に描画できます。
受け入れられた「正式な」正規表現構文によって制限されている場合、対応する有限サイズの正規表現はありません (完全な代数で必要な「and」、「xor」、「not」などの単純な演算子の欠如)。
しかし、このような多くの解決策があります
(0|100|(1|10|11*)$)*
所有格マッチングでも解決できます。(111+$) は 111++