web-dev-qa-db-ja.com

0の偶数または1の奇数の2進数の最短正規表現

0の偶数または1の奇数を含む式を記述します

私はそれを手に入れました:

1*(01*01*)* + 0*10*(10*10*)*

最初の部分は0の偶数を表し、2番目の部分は1の奇数を表します

しかし、私が見ない単純化された解決策があるはずです。任意のヒント?

23
user3085290

奇数1秒の部分:0*1(0|10*1)*

偶数次の部分は、次のように異なります。

  1. 空の文字列は正しいです:_(1|01*0)*_
  2. 0は0以外の偶数:_(1|01*0)+_
  3. 少なくとも2つの0が必要です:1*(01*01*)+(OPと同様)

古い答え:ケース1と2で正しい

_(1*(01*0)*)+ | 0*1(0*(10*1)*)*
_

役立つコメントを@OGHazaに感謝します。

19
Julián Urbano

偶数長の文字列が常に制約を満たすという事実を利用する:

^(([01]{2})*|1*(01*01*)*)$
11
Ruud Helderman

「最短」を定義します。最短の評価時間(つまり最速)を探している場合は、キャプチャグループを使用しないようにしてください。

これはJavaScriptの例です

^(?:1*(?:01*0)*)+|0*1(?:0*(?:10*1)*)*$

キャプチャグループを使用するこの式よりも20%速く表示されますが、同じ答えが得られます

^(1*(01*0)*)+|0*1(0*(10*1)*)*$
1
gillyspy

最も少ないシンボルで、

1*(01*01*)*
0
Moses Kirathe

私が見つけた最も簡単な解決策は次のとおりです:

1+0(0+1)((1+0)(1+0))*
0
Mehran