- ベストアンサー
正規表現
お世話になります。正規表現の質問です。 \w に当たる文字とハイフンに合致するが、少なくとも一文字はアルファベット(a-z)またはハイフン(-)が含まれていなければならない(つまり、数字だけの文字列は合致しない) という正規表現はどうあらわせばよいでしょうか。 以上、よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
/^[-\w]*[-a-z][-\w]*$/ でいいのでは。
その他の回答 (3)
- pick52
- ベストアンサー率35% (166/466)
全体からというなら $str にその対象文字列があるとして $str !~ /^([^a-z\-])+$/ && $str =~ /([\w\-]+)/ というのはどうでしょうか。 試してみた限りでは正常に動いているように見えますけどちょっと 保証できません。
お礼
すいません、ANo.1 の補足にも書きましたが、一つの正規表現で表したかったのです。
- sakusaker7
- ベストアンサー率62% (800/1280)
一つで書けばスマートかと言うのは違うと思いますけどね。 性能を実測すれば不利な場合もあるはず。 #!/usr/bin/perl use strict; use warnings; use feature ':5.10'; my $pattern = qr<^(?=.*[a-z-])[\w-]+$>; while (<DATA>) { chomp; say "try $_"; my $cond = $_ =~ $pattern; say ($cond ? "match" : "unmatch"); } __END__ 1234 abc123 -123 789-456 789xyz 実行結果: try 1234 unmatch try abc123 match try -123 match try 789-456 match try 789xyz match とこんな感じでいいですか?
お礼
パフォーマンスの件に関しては、マッチングさせる文字列は10文字程度なので心配していないのです。 なんにせよ、わかりやすいサンプルまで用意していただいてありがとうございました。
- sakusaker7
- ベストアンサー率62% (800/1280)
一つの正規表現で済まそうなんて考えないで、二段階でやればいいと思いますよ。 Perlのカテゴリで訊いているのだから、一つの正規表現でなければならない理由はないでしょう?
補足
ごめんなさい、大事なことが抜けていました。 ここでの正規表現パターンは、他人の作ったフレームワークライブラリの関数への「引数文字列」として使用する予定です(実際の正規表現のパターンマッチングおよびその非マッチング処理はそのフレームワーク内で行う)。 もちろん、そのフレームワーク関数を使用する前に複数段階の正規表現を使ってパターンマッチングを行う(そしてマッチングに失敗すればその時点でエラーを返す)ことは可能ですが、出来れば一発で正規表現(の文字列)をフレームワーク関数に引き渡せればスマートなので。
お礼
なるほど、とても簡単な正規表現であらわせるのですね。 ありがとうございます。