基数2(2進数)の数値が3の倍数であるかどうかを知るために、正規表現を作成する方法を知りたいです。このスレッドで読んだことがあります 数値が3で割り切れるかどうかを確認してください 正規表現でそれをしないでください、そして誰かが描いたグラフは間違っています(それは偶数を受け入れないので)。 ((1 +)(0 *)(1 +))(0)で試しましたが、一部の値では機能しません。あなたが私を助けてくれることを願っています。
更新:わかりました。ご協力いただきありがとうございます。NFAの描画方法がわかりました。ここで、グラフと正規表現を残しました。
グラフでは、状態は基数10 mod3の数値です。
例:状態1に進むには、1が必要です。次に、1または0を追加できます。1を追加すると、11(基数10の3)になり、この数値mod 3が0の場合、円弧を描きます。状態0に。
((0*)((11)*)((1((00) *)1) *)(101 *(0|((00) *1 *) *0)1) *(1(000)+1*01)*) *
そして、他の正規表現は機能しますが、これはより短いです。
どうもありがとう :)
私の解決策を このコードゴルフの質問 !これは、各ベースの分割可能性のために正規表現を生成する(おそらく非効率的ですが、仕事をします)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:また、これは この質問 の複製です。
これは古い質問ですが、効率的な回答はまだ得られておらず、この質問は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)*
_
ごきげんよう。