アカウント名:
パスワード:
「正規表現」と「数独」で思いついたんだけど「1~9の数字をそれぞれ1度だけ使った9桁の数字」にマッチする正規表現ってあるのかな?ぜんぜんアイデアが沸かない
ものすごく長い正規表現であれば可能ですね。これ以外のスマートな書き方は思いつきません。
9!通りの可能性を全部書き出して | で並べる。
それしかないね。『1~9の数字をそれぞれ1度だけ』を人間がスマートにやろうとすると、入力を読んでいくときに『それまでにどの数が出現したか』を覚えておこうとするのが普通だろう。それに対し、正規表現は『入力をどこまで読んだか』『正規表現のどこまでがマッチしたか』ということしか状態を持てない。そういう問題を文法でどうにかするのは向いてないな。
とか思ったけど、古典的な正規表現だと無理でも、ほかの人が言っている通り後方参照が使える言語ならベタに展開しなくてもできるね。あんまり書きやすくはないし、かなり長いけど……
3文字だけの例:http://ideone.com/T8Zxww [ideone.com]
数学者は(計算複雑性理論とか計算機科学とかの一部の分野を除くと)効率を考慮しないから有限の長さの正規表現で書けるなら「書ける」という結論にしかならないけどな。下手すると実際に正規表現を書き下すことなしに存在を示すだけ。
0は入らないから駄目じゃ?
「そういうものだけが単独で現れる行」になら^(?!.*(.).*\1)[1-9]{9}$でマッチさせられる。他の文字列の中にそういうものが混じっている場合にはこの手は使えないけど。
(?=.*1.*)(?=.*2.*)(?=.*3.*)(?=.*4.*)(?=.*5.*)(?=.*6.*)(?=.*7.*)(?=.*8.*)(?=.*9.*)[1-9]{9}
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
物事のやり方は一つではない -- Perlな人
[1-9]{9} じゃなくて (スコア:2, 興味深い)
「正規表現」と「数独」で思いついたんだけど
「1~9の数字をそれぞれ1度だけ使った9桁の数字」にマッチする正規表現ってあるのかな?
ぜんぜんアイデアが沸かない
Re:[1-9]{9} じゃなくて (スコア:2)
ものすごく長い正規表現であれば可能ですね。これ以外のスマートな書き方は思いつきません。
HIRATA Yasuyuki
Re: (スコア:0)
9!通りの可能性を全部書き出して | で並べる。
Re:[1-9]{9} じゃなくて (スコア:1)
それしかないね。
『1~9の数字をそれぞれ1度だけ』を人間がスマートにやろうとすると、入力を読んでいくときに『それまでにどの数が出現したか』を覚えておこうとするのが普通だろう。
それに対し、正規表現は『入力をどこまで読んだか』『正規表現のどこまでがマッチしたか』ということしか状態を持てない。
そういう問題を文法でどうにかするのは向いてないな。
Re:[1-9]{9} じゃなくて (スコア:1)
とか思ったけど、古典的な正規表現だと無理でも、
ほかの人が言っている通り後方参照が使える言語ならベタに展開しなくてもできるね。
あんまり書きやすくはないし、かなり長いけど……
3文字だけの例:
http://ideone.com/T8Zxww [ideone.com]
Re: (スコア:0)
数学者は(計算複雑性理論とか計算機科学とかの一部の分野を除くと)効率を考慮しないから有限の長さの正規表現で書けるなら「書ける」という結論にしかならないけどな。下手すると実際に正規表現を書き下すことなしに存在を示すだけ。
Re: (スコア:0)
これじゃだめかな?
正規表現とは呼べないかもしれないけど。
Re: (スコア:0)
0は入らないから駄目じゃ?
Re: (スコア:0)
Re: (スコア:0)
「そういうものだけが単独で現れる行」になら
^(?!.*(.).*\1)[1-9]{9}$
でマッチさせられる。
他の文字列の中にそういうものが混じっている場合にはこの手は使えないけど。
Re: (スコア:0)
(?=.*1.*)(?=.*2.*)(?=.*3.*)(?=.*4.*)(?=.*5.*)(?=.*6.*)(?=.*7.*)(?=.*8.*)(?=.*9.*)[1-9]{9}