- ベストアンサー
言語ではなく、正規表現のみで複数の条件を記述する方法 ?
一つの条件の正規表現は書けるようになりましたが、 条件が重なった場合の対処の仕方がわかりません。 my $val = "12"; #数字のみ if($val =~ /^[0-9]+$/){ # match! } #0で無い if($val !~ /^0$/){ # match! } # 数字で0でない <---複数条件 ? # 言語でカバーするのではなく、正規表現のみ(1つの正規表現) # でANDやORやXORができるパターンの記述方法が知りたいです。 if($val =~ /^[0-9]+$/) && ($val !~ /^0$/){ # match! }
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
条件式の AND や XOR に相当するものは、正規表現には存在しません。というのも、正規表現で表すのは「パターン」であり、「条件」ではないからです。 ※OR についてはパターンの選択を行う | が相当します。 このため、複数の条件式にしたくない場合は、1つで複数の条件を満たすパターンを書くしかありません。また、汎用的な方法もないので、ケースごとにパターンを書き下ろさなければなりません。 No.2 補足より > 言語を使った&& ||ではスマートではなく、複雑な内容になってきた場合、1行で解決できた方が発展性があるかと思いましてこだわっております。 確かに「0ではない数字」程度のことを複合条件にするのはスマートとは言えないでしょう。しかし、関連性のない事柄を無理なパターンで表現するくらいなら、分解して && や || で結合した方がすっきりします。 また、大概の場合、1行で無理に解決した方が発展性には欠けますので、発展性やメンテナンス性を求めるならば、あまりこだわらない方がよいでしょう。
その他の回答 (4)
- root139
- ベストアンサー率60% (488/809)
「$val =~ /^[0-9]+$/」と「$val !~ /^0$/」を一つにまとめると、下記の様な感じでしょうか。 -------------------------------------------------- if($val =~ /^(?:[1-9]|[0-9]{2,})$/){ # match! } -------------------------------------------------- 0以外の数字一文字([1-9])、または、数字2文字以上([0-9]{2,})にマッチする正規表現となります。
- moon_night
- ベストアンサー率32% (598/1831)
#2です 最後の if(($FORM{'s'} =~ /^[^0]+$/) and ($FORM{'s'} =~ /^\d+$/)){ # match! } は間違いです。
- moon_night
- ベストアンサー率32% (598/1831)
if(($val =~ /^[0-9]+$/) && ($val !~ /^0$/)){ # match! } とか if($val =~ /^[0-9]+$/){ if($val !~ /^0$/){ # match! } } とか if($FORM{'s'} =~ /^[1-9][0-9]*$/){ # match! } とか if(($FORM{'s'} =~ /^[^0]+$/) and ($FORM{'s'} =~ /^\d+$/)){ # match! } など・・
- akamanbo
- ベストアンサー率17% (462/2680)
正規表現自体は少しくらいならわかりますが、 Perlは全くわからないので、参考程度に… ↓ではダメなんですか? if($val =~ /^[1-9]+$/){ # match! }
補足
この場合でしたら数字に0が入るとマッチしません。 例)101や500など。 スマートな方法があるかもしれませんが、正規表現内でandとorのようなものが使えるか、使えるのでしたらその記述方法が知りたいです。
補足
ありがとうございます。 if($FORM{'s'} =~ /^[1-9][0-9]*$/){ # match! } これが一番スマートだと思います。 でも私が一番知りたいのは正規表現で(?のような拡張構文を使って似たようなことができないかという内容で、でもmoon_right様には感謝しております。 なぜ、正規表現のみでこだわるかといいますと、言語を使った&& ||ではスマートではなく、複雑な内容になってきた場合、1行で解決できた方が発展性があるかと思いましてこだわっております。 よろしくお願いいたします。