可能性のある複製:
数値が正規表現を持つ素数であるかどうかを判断する方法?
このページ は、この正規表現が素数以外の数を発見すると主張します(反例:素数):
/^1?$|^(11+?)\1+$/
これはどのように素数を見つけるのですか?
記事はそれをかなりよく説明していると思いますが、私もそれを手に入れます。
入力は nary 形式です。 1は1
、2は11
、3は111
などです。ゼロは空の文字列です。
正規表現の最初の部分は、非素数として0と1に一致します。 2つ目は、魔法が始まる場所です。
(11+?)
は、除数を見つけることから始まります。 11
、または2として定義されることから始まります。\1
は、以前にキャプチャされた一致を参照する変数であるため、\1+
は、数値がその除数で割り切れるかどうかを決定します。 (111111
は、変数を11
に割り当てることから始まり、残りの1111
は11
の繰り返しであるため、6は2で割り切れる。)
数が2で割り切れない場合、正規表現エンジンは除数を増分します。 (11+?)
は111
になり、再試行します。いずれかの時点で正規表現が一致した場合、数値には余りが生じない除数があるため、数値を素数にすることはできません。
これがbase-1(単項ですか?)
このycombinatorの議論 の何人かの人々はこれを非常によく説明しています。実際、私が思うよりも簡潔な説明なので、リンク先にお任せします。