perl 正規表現の質問です。


[^\w.@-] は何を示しているのでしょうか?

"[]"や、"^" "\w" "." "@" といった個々の要素はわかります。

"-" がここで使われるのがよくわかりません。。
これ全体で何がやりたいのかを知りたいです。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2007/03/15 15:58:52
  • 終了:2007/03/16 00:22:46

回答(2件)

id:ootatmt No.1

ootatmt回答回数1307ベストアンサー獲得回数652007/03/15 16:06:43

ポイント60pt

[]の中の末尾にある"-"は"-"そのものにマッチします。

つまり \w.@- はメールアドレスに使われる文字ですね。

最初に ^ が付いていますから、メールアドレスに使われる文字以外にマッチする正規表現だと思います。


メールアドレスに使ってはいけない文字が含まれているかを判断するために使っているんじゃないですかね。

http://www.glasscom.com/tone/linux/Reference/RegularExp.htm

質問者が未読の回答一覧

 回答者回答受取ベストアンサー回答時間
1 きゃづみぃ 13539 10064 1198 2007-03-15 16:07:18
  • id:b-wind
    >メールアドレスに使ってはいけない文字が含まれているかを判断するために使っているんじゃないですかね。
    それっぽいけど _ (アンダーバー)が入っていない。
    まぁ厳密に言い出したらきりが無いけど。
  • id:ootatmt
    "_"も入っていますよ。
    "."をエスケープしてないからうまくいかないような気もしますけど。
  • id:nandedarou
    >"."をエスケープしてないからうまくいかないような気もしますけど。
    同意。
  • id:nandedarou
    訂正:[]の中では、"."をエスケープしなくて大丈夫みたいです。

    あと、環境により、"_"も\wに含まれるそうです。

    "-"はエスケープすることをお勧めしますが、末尾だからいいのかな?
  • id:ootatmt
    > 訂正:[]の中では、"."をエスケープしなくて大丈夫みたいです。

    あっ、そうなんですか。
    いいこと聞いた。(^^)
  • id:nandedarou
    改行が入りすぎたので、削除して書き直しました。(何度もすみません。)
    >あっ、そうなんですか。
    ただ、"."はエスケープする癖をつけた方がいいですね。
    (自分で情報提供しといてなんですが…。)

    ところで、
    重要な欠陥?があるかもしれません。
    >最初に ^ が付いていますから、メールアドレスに使われる文字以外にマッチする正規表現だと思います。
    もし、この正規表現にマッチしなかったら、メアドとしてOKという判断をプログラムでしているなら、重大な欠陥でしょう。
    漢字やひらがなは、この正規表現にはマッチしませんので、メアドに使ってOKと判断されかねません。
    ※漢字やひらがなは、絶対に入力されない仕組みなら、構いませんが…。
    ※正規表現自体のミスではありません。
  • id:ootatmt
    > 漢字やひらがなは、この正規表現にはマッチしませんので

    マッチしませんか?
    マルチバイト文字は ^\w にマッチすると思いますが、違うかな?
  • id:znz
    マッチするかどうかはuse utf8しているかどうかなどの条件で変わってきます。

    例えば、

    if ("あ" =~ /[^\w.@-]/) {
    print "match\n";
    } else {
    print "not match\n";
    }
    use utf8;
    if ("あ" =~ /[^\w.@-]/) {
    print "match\n";
    } else {
    print "not match\n";
    }

    でmatchとnot matchになります。
  • id:nandedarou
    znzさんありがとう、考えやすくなりました。

    ●use utf8;をつけなかった場合
    a → not match → メアドに使ってOK
    あ → mach → メアドに使ってはダメ
    この結果一見よさそうですが、単にマルチバイトだから、こうなったのだと思います。
    現実的には、正規表現に*をつけ、文字列も判断できるようにします。そうすると、次の結果が出ると思います。
    あ@ → not match → メアドに使ってOK
    よって、このロジックは、欠陥です。
    phpの次のコードで検証しました。
    $a='あ@';
    if( preg_match('/^[^\w.@-]*$/', $a) ){
    print($a . '→match→NG');
    }else {
    print($a . '→not match→OK');
    }
    use utf8;をつけない場合、perlでも同様だと思いますが、どうでしょうか?

    ●use utf8;をつけた場合
    a → not match → メアドに使ってOK
    あ → not match → メアドに使ってOK
    よって、このロジックは、欠陥です。

    以上から、use utf8;を使っても使わなくてもこのロジックは欠陥。

    ただし、もう一度書きますが、
    ※漢字やひらがなは、絶対に入力されない仕組みなら、大丈夫。
    ※正規表現自体のミスではありません。
  • id:ootatmt
    use utf8 すると"あ"も \w にマッチするんですね。
    いつも use utf8 してたけど気にしてませんでした(ややこしいので \w は使っていなかったという方が正確かも)。

    >nandedarouさん
    めんどくさいので詳しく書きませんけど、^[^\w.@-]*$ でも [^\w.@-] でも一緒だと思いますよ。
    また、この正規表現は簡易的なものなので漏れがあるのは承知の上だと思います。

    もっと素直に、[a-zA-Z0-9.@_-]にすればいいのにね。
  • id:nandedarou
    間違ってました。一つでも、メアドに使える文字があると
    [^\w.@-]*
    にマッチしないですものね。

    ちょっと、私の間違いもあって、欠陥が本当にあるのか分からなくなってきました。use utf8;をつけなかった場合は、欠陥はないかも知れません。この辺で考えるのやめます。すみません。

    >もっと素直に、[a-zA-Z0-9.@_-]にすればいいのにね。
    そう思います。
  • id:nandedarou
    もう一度よく考えてみたところ、use utf8;をつけない場合、やはり、欠陥はないようです。

    ^[\w\.@\-]*$ にマッチすれば、OK(全部、メールに使える文字ならば、OK)
    のロジックにすべきだと思ったのですが、
    [^\w\.@\-]  にマッチしなければ、OK(メールに使えない文字が一つもなかったら、OK)
    と同じことですね。

    結局、
    use utf8;を使ときだけは、気をつけましょう。というのが結論ですね。長々と失礼致しました。

  • id:ootatmt
    use utf8 が標準になるのは perl 5.9 からでしたでしょうか?
    最近は変数名を漢字で書いているのですが、便利ですよ。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません