• ベストアンサー

言語ではなく、正規表現のみで複数の条件を記述する方法 ?

一つの条件の正規表現は書けるようになりましたが、 条件が重なった場合の対処の仕方がわかりません。 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! }

  • Perl
  • 回答数5
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.5

条件式の AND や XOR に相当するものは、正規表現には存在しません。というのも、正規表現で表すのは「パターン」であり、「条件」ではないからです。 ※OR についてはパターンの選択を行う | が相当します。 このため、複数の条件式にしたくない場合は、1つで複数の条件を満たすパターンを書くしかありません。また、汎用的な方法もないので、ケースごとにパターンを書き下ろさなければなりません。 No.2 補足より > 言語を使った&& ||ではスマートではなく、複雑な内容になってきた場合、1行で解決できた方が発展性があるかと思いましてこだわっております。 確かに「0ではない数字」程度のことを複合条件にするのはスマートとは言えないでしょう。しかし、関連性のない事柄を無理なパターンで表現するくらいなら、分解して && や || で結合した方がすっきりします。 また、大概の場合、1行で無理に解決した方が発展性には欠けますので、発展性やメンテナンス性を求めるならば、あまりこだわらない方がよいでしょう。

その他の回答 (4)

  • root139
  • ベストアンサー率60% (488/809)
回答No.4

「$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)
回答No.3

#2です 最後の if(($FORM{'s'} =~ /^[^0]+$/) and ($FORM{'s'} =~ /^\d+$/)){ # match! } は間違いです。

  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.2

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! } など・・

kounesi
質問者

補足

ありがとうございます。 if($FORM{'s'} =~ /^[1-9][0-9]*$/){ # match! } これが一番スマートだと思います。 でも私が一番知りたいのは正規表現で(?のような拡張構文を使って似たようなことができないかという内容で、でもmoon_right様には感謝しております。 なぜ、正規表現のみでこだわるかといいますと、言語を使った&& ||ではスマートではなく、複雑な内容になってきた場合、1行で解決できた方が発展性があるかと思いましてこだわっております。 よろしくお願いいたします。

  • akamanbo
  • ベストアンサー率17% (462/2680)
回答No.1

正規表現自体は少しくらいならわかりますが、 Perlは全くわからないので、参考程度に… ↓ではダメなんですか? if($val =~ /^[1-9]+$/){ # match! }

kounesi
質問者

補足

この場合でしたら数字に0が入るとマッチしません。 例)101や500など。 スマートな方法があるかもしれませんが、正規表現内でandとorのようなものが使えるか、使えるのでしたらその記述方法が知りたいです。

関連するQ&A

  • ASP言語での正規表現の書き方

    if instr(hoge,"Android 4.2.2; ")>0 then 上記のifで4.2.2の数字が変わっても拾えるよう正規表現で記述したいです。 どう書けばよいですか? ASP言語で正規表現を使った事が無いので、使用できるのかも判りません。 宜しくお願い致します。

  • 正規表現

    if(str.match(/^[-+]?\d+$/)) alert("matched !"); この正規表現(先頭に+か-かをつけてあとは数字という表現です。)で 全体が//で囲まれてますがどうしてでしょうか? オプションとしてgとかiがあるのならわかるのですがないみたいです。 また^と$をつかった表現で例えば^AB$とした場合どうしてACBは含まれないのでしょうか?

  • += -= *= /= を判別する正規表現

    PHP5.2.4を使用しています。 $key = 'a +='; $val = 2; の場合に、 a = a + 2 となるように変換するためには preg_match(ここに何か記述, $key, $match)を使ってどのように記述すれば良いのでしょうか? 例えば、次の条件だったら $key = 'a -='; $val = 2; a = a - 2 と変換したいです。 if (preg_match(ここに何か記述, $key, $match)) {  ここで$keyと$valと$matchを使って  a = a (+ or - or * or /) 2となるように記述すると思うのですが }

    • ベストアンサー
    • PHP
  • 正規表現について

    いま.Netで正規表現にチャレンジしているのですが、どこが問題なのか分からず、投稿させていただきました。 正規表現のパターンです。 \\[Cc]\[(?<$0>[0-9]+),(?<$1>[0-9]+),(?<$2>[0-9]+)\] で、マッチさせたい文字列は、 \C[255,255,255] です。「[255,255,255]」の数字の部分は、一桁から三桁までの数字であれば何でもOKです。 マッチしないことは、http://jsregex.com/を使って調べました。 どうぞよろしくお願いします。

  • 正規表現のAND条件記述手法

    お世話になります。 正規表現でAND条件を実現したいのですがうまくいかないでいます。 以下のような任意の文字列 1234567890 があったとして、3~5を抜き出したい時の正規表現は [3-5] とすると、そこへ6も対象に入れたいとなれば [3-5]|6 とすればOR条件でいけると思います。 この逆といいますか、AND条件のように記述したいのですが、 3~5だけど、4はやっぱ含まないというのはどのように表記するのか 手法を教えて頂けたらとおもいます。 [3-5]&[^4]  ???。。 (単純に[3,5]とすれば良いのでしょうが、もっと複雑な表現に応用を考えてます) 宜しくお願い致します。

    • ベストアンサー
    • Perl
  • 正規表現について

    お世話になります。 ●●● ●●● という文字列かどうか判断する正規表現を作成したいです。 条件としては、 ・「文字1 (←全角スペース)文字2」という感じで、文字1と文字2に全角スペースが挟まれている感じで、文字列の先頭にも末尾にも空白文字は入ってはいけない(真ん中に1つのみ) ・文字1と文字2には、数字・空白以外の文字が入る(主に感じ・ひらがな・カタカナが入る)(文字数は一文字以上) といったところです。 自分で作成した正規表現は、 $pattern = '/^([\d\S])+ ([\d\S])+$/'; if( !preg_match($pattern,$chkStr) ) print "マッチしていない"; } なんですが、どうもマッチしてほしい文字にマッチしていないようなのです。 お手数ですがご教授ください。

    • ベストアンサー
    • PHP
  • 正規表現の記述方法で困っています

    正規表現の記述方法で悩んでいます。 abcdefg"hijk\"lmn\"opqi"stu というような文字列から、""で囲まれた部分を マッチさせたいのですが、 「\"」に関しては「"」では無いという扱いにしたいため マッチさせたいのです。つまり上記例では、 hijk\"lmn\"opqi をマッチさせたいのですが、出来るでしょうか? 結構悩んでいます。

    • ベストアンサー
    • PHP
  • 正規表現でしょうか?

    下記のようなY-m-d形式の配列があるとします。 $dates['2008-12-01']; $dates['2008-12-05']; $dates['2008-12-15']; ・・・ これをY-m-jの形式に従い $dates['2008-12-1']; $dates['2008-12-5']; $dates['2008-12-15']; ・・・ のように日付の頭にに0(01~09)があれば0を削除した状態に変換 させたく思いついたのが正規表現で日付の頭に0があれば削除する ということを行いたいです。 foreach ($dates as $val) { if (条件にマッチすれば) { $val = 頭の0を削除; } $setdates[$val];// ←実際に使用する配列です。 } こんな感じで実現できるとは思うのですが肝心な部分をどうやって いいものかわからない状態です。 絶対に正規表現ということではないので他にもスマートな方法が ありましたら教えて頂けますと幸いです! 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 正規表現について

    以下のようなファイル名にマッチする正規表現は [ファイル名] 20080303_001test.txt 20080303_002test.txt [正規表現] ^20080303_(001|002)test\.txt$ であってますでしょうか。 ※特に()内の、"001"と"002)test\.txt"のどちらかにマッチすれば良いという条件になってないか心配です。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 正規表現-数字

    VB6で開発しています。 ひとつのテキストボックスがあり(MAXLENGTHが4)、 半角数字or小数点しか入力できないように制御しています。 下記正規表現確認関数で、 00.0~99.9の値のみ認証したいのですが、 (チェック前に Format( XX , '00.0')に変換してます) ○ 3 ○ 3.3 ○ 33 ○ 33.3 × 3.33 × .333 × 333 △ 3.00 → 3.0に変換させる パターンマッチング (\d{1,2}.\d|\d{1,2})ですと 本来×の333がOKとなってしまいます。 正規表現が間違っているのでしょうか? アドバイスお願いします。 関数はこちら Public Function RegExpCheck(ByVal ChkString As String, _ ByVal RegPattern As String) As Boolean '(一部省略) '引数:ChkString 正規表現確認対象文字 ' RegPattern パターン '戻り値:True マッチしている ' :False マッチしていない、あるいは文字・パターンが空白 '(一部省略) Dim reg As New RegExp RegExpCheck = False On Error GoTo RegErr '引数空白チェック・・・空白の場合はFalseを返す '対象文字列 If Trim$(ChkString) = vbNullString Then Exit Function End If 'パターン If Trim$(RegPattern) = vbNullString Then Exit Function End If reg.Pattern = RegPattern If reg.Test(CStr(ChkString)) = True Then RegExpCheck = True End If Exit Function RegErr:

専門家に質問してみよう