web-dev-qa-db-ja.com

3の2進数の正規表現

基数2(2進数)の数値が3の倍数であるかどうかを知るために、正規表現を作成する方法を知りたいです。このスレッドで読んだことがあります 数値が3で割り切れるかどうかを確認してください 正規表現でそれをしないでください、そして誰かが描いたグラフは間違っています(それは偶数を受け入れないので)。 ((1 +)(0 *)(1 +))(0)で試しましたが、一部の値では機能しません。あなたが私を助けてくれることを願っています。

更新:わかりました。ご協力いただきありがとうございます。NFAの描画方法がわかりました。ここで、グラフと正規表現を残しました。

グラフでは、状態は基数10 mod3の数値です。

例:状態1に進むには、1が必要です。次に、1または0を追加できます。1を追加すると、11(基数10の3)になり、この数値mod 3が0の場合、円弧を描きます。状態0に。

Whiteboard version

((0*)((11)*)((1((00) *)1) *)(101 *(0|((00) *1 *) *0)1) *(1(000)+1*01)*) *

そして、他の正規表現は機能しますが、これはより短いです。

どうもありがとう :)

14
voodoo14

私の解決策を このコードゴルフの質問 !これは、各ベースの分割可能性のために正規表現を生成する(おそらく非効率的ですが、仕事をします)JavaScriptの一部です。

これは、基数2で3で割り切れる場合に生成されるものです。

/^((((0+)?1)(10*1)*0)(0(10*1)*0|1)*(0(10*1)*(1(0+)?))|(((0+)?1)(10*1)*(1(0+)?)|(0(0+)?)))$/

編集:Asmorと比較すると、おそらく非常に非効率的です:)

編集2:また、これは この質問 の複製です。

14
Casey Chu

これは古い質問ですが、効率的な回答はまだ得られておらず、この質問はGoogleの「3正規表現で割り切れるバイナリ」に対して最初に表示されます。

著者によって提案されたDFAに基づいて、バイナリ文字列がDFAを通過できるルートを単純化することにより、途方もなく短い正規表現を生成できます。

状態Aのみを使用する最も単純なものは、次のとおりです。

_0*_

状態Bを含む:

0*(11)*0*

状態Cを含む:

0*(1(01*0)*1)*0*

また、状態Aに戻った後、プロセス全体を再開できるという事実も含めてください。

0*((1(01*0)*1)*0*)*

いくつかの基本的な正規表現ルールを使用して、これは単純化して

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

ごきげんよう。

40
Kert Ojasoo