• 締切済み

「マッチしない」正規表現の書き方

正規表現について、おたずねします。 文字列 abc,def,ghi のいずれかにマッチする正規表現は (abc|def|ghi) ですよね。 それでは、「abc,def,ghi のいずれにもマッチしない」正規表現は、どう書けばいいのでしょうか? あちこち調べましたが、どうしてもわかりません。 ただし、if $a =~ /(abc|def|ghi)/ などで、=~ を !~ に直す、というのはナシです。あくまでも右辺の式の中で表現したいのですが…

  • dep98
  • お礼率94% (235/250)
  • Perl
  • 回答数2
  • ありがとう数3

みんなの回答

  • sssohei
  • ベストアンサー率33% (33/98)
回答No.2

/[^a]bc|[^d]ef|[^g]hi/ こういうのでしょうか^^; 一般的なのはPerl拡張正規表現 /(?!abc)|(?!def)|(?!ghi)/ みたいになるのでしょうか?^^; 意図している具体例を挙げて頂ければ、他の方法が良いかも知れませんが^^; perl -e "$str = 'abdefgh'; $str =~ /([^a]bc|[^d]ef|[^g]hi)/; print $1 eq ''; " perl -e "$str = 'abcdefghi'; $str =~ /((?!abc)|(?!def)|(?!ghi))/; print $1 eq ''; 出力はいずれも1。ActivePerl (Build 630)で確認しました。

dep98
質問者

お礼

ご回答ありがとうございます。 > [^a]bc|[^d]ef|[^g]hi/ 実際には abc/def/ghi というのはドメイン名(FQDN)でもっと複雑で長い文字列になるので、この方法ではちょっとダメそうです。 やはり ?: や ?! を使うのでしょうが、2番目の例は、こちらで試した限りでは、うまくいきませんでした。 もう少し、いろいろ調べてみます。

  • 2nd
  • ベストアンサー率30% (19/63)
回答No.1

この場で、詳細に説明することは私には難しいので 割愛させていただきます。 #混乱させるだけになりますので。 ご自身でお調べいただくか、識者のご登場に期待してください。 ともかく、こんな感じでできているでしょうか? #若干不十分かも知れません。 /(?=^(?:(?!abc).)*$)(?=^(?:(?!def).)*$)(?=^(?:(?!ghi).)*$)/s それでは。

dep98
質問者

お礼

ご回答ありがとうございます。 例の通りにやってみたら、意図する動作ができました! 私も Perl を使って結構長いんですが、この ?= とか ?: とか ?! が、まだイマイチよく理解できないんですよ。ラクダ本見ても、例があまりなくてよくわからないし… もう少し、あちこち当たって勉強してみます。

関連するQ&A

  • 正規表現で括弧にマッチさせたいのですが・

    Javaで正規表現を使おうとしてるのですがうまく行きません。 次のようにマッチさせたいです。 マッチさせたい文字列 : (abc)and(efg) マッチする文字列 : abcとefg マッチさせたい文字列 : (abc(efg)) マッチする文字列 : abc(efg) もしくは abc(efg)とefg とのようにまっちさせたいです。上の方はできたのですが、下の方がabc(efgとマッチしてまうのです。 いい方法を教えてください><お願いします。

  • 正規表現でのパイプ(or)を減らしたいのですが

    いつもお世話になっています。 正規表現のパイプ(|)は非常に遅くなるらしいので、[]内に並べるようにプログラムを修正しようと思っています。それで、 /a|b|c/ ---> [abc] のような方法は、よく紹介されているのですが、a,b,cが単独文字ではなく、単語になっているような場合、 /abc|def|ghi/ ---> [(abc)(def)(ghi)] だと多分ダメですよね(今実行環境が無く確認できません)。 それで、各々の単語を $a = 'abc'; $d = 'def'; $g = 'ghi'; のようにあらかじめ定義しておいて、 /$a|$d|$g/ ---> [$a$d$g] というように書き換えると、うまくいくのでしょうか? やり方が間違っていましたら、ご指摘いただきたく、よろしくお願いします。

    • ベストアンサー
    • Perl
  • [15]にマッチする正規表現

    [15]にマッチする正規表現 [15] にマッチする正規表現を書きたいのですが、うまくいきません。。。。 簡単だ、と思ったのですが。。。 expr "$DATA1" : .*\[15\].* と書くと、中の数字が15じゃなくてもマッチしてしまいます。 expr "$DATA1" : .*15.* であれば"15"にマッチしますが、対象の文字列の都合上、カッコでも識別する必要があり 困っております。[と]をエスケープする目的で\をつける、と思っているのですが、何か 思い違いをしているのでしょうか。

  • Rubyにおける正規表現(一致しない)

    Rubyを使って、テキスト処理をやっています。 どうしても、うまく行かないところがあります。 サジェスチョンをお願いします。 正規表現にて、 2つの条件フラグが成立していて、かつ、特定の文字列を含まないという条件です。 1行の内容は、textに入っています。 if (myFlag1==1) && (myFlag2==1) && (!/abc def/) then xxxxxxxx end (!/abc def/)は、perlでの表現です。Rubyでは、少なくとも (!/abc def/=~text) かな、と考えましたが、ダメでした。 (/abc def/!=text) でも、だめでした。 宜しくお願いいたします。

  • c#で正規表現を使用してのmatchがうまくいきません。

    c#で正規表現を使用してのmatchがうまくいきません。 例えば以下のようなタグがあったとします この6行をmatchの対象の文字列としたとします。(タグは適当です) ---------------------------------------- <select class="iiy_name_list"> <option value="1347">abc</option> </select></td> <select class="sug_name_list"> <option value="761">def</option> </select></td> ---------------------------------------- 2行目の"abc"を含む列が欲しかったので、以下のように正規表現にてキャプチャ範囲を指定 @"<option\s+value=""1347"">(.*)</select></td>", しかし、”(.*)”以降に指定した"</select></td>"というタグは match対象の全体分には2箇所全く同じ物があるため、2回目に出現した"</select></td>"まで読み込み、不必要なdefの行までも取得してしまいます。 "</select></td>"以外に正規表現で指定できる文字はありません、 ”(.*)”以降に指定した"</select></td>"が最初に出現した場所までをキャプチャし、2回目に出現してもキャプチャの範囲対象外にするには どのようにすればよいのでしょうか? よろしくお願いします。

  • 正規表現。行頭が○○以外にマッチさせたい。

    正規表現を勉強しています。行頭がxyzという文字列以外をマッチさせたいと思っています。行頭にマッチさせるには"^xyz"と理解できます。[^xyz]とやるとx,y,z以外の文字列にマッチするのもわかります。ただ、これだと 123 xyz の文字にもマッチしていまいます。行頭がxyzで続く文字列以外にマッチさせる正規表現はどうかけばよろしいでしょうか?

  • phpの正規表現

    phpの正規表現で困っています。 下記のような文で括弧で囲まれた文字列だけを消したいのですが、 (ABC)あいうえお(DEF) /(.*)/で置換すると文章が全部消えてしまいます。 「あいうえお」だけを残したいのですがうまくいきません。何方か教えてください。お願いします!

    • ベストアンサー
    • PHP
  • VBScriptでの正規表現パターンマッチ

    ASPプログラムの中で 文字列のパターンマッチを正規表現で行ないたいと考えています。 英字と数字両方を組み合わせた文字列(英字と記号且つ数字)であることをチェックしたいのですが 以下のようなロジックでは、英字、数字どちらかだけの文字列もマッチしてしまうのではと思います。 ほかによい書き方はありますでしょうか? Dim strTEST TESTCHECK = 0 Dim objRE Set objRE = new RegExp objRE.pattern = "[_\-a-zA-Z0-9]" If (objRE.Test(strTEST) = True) Then Else TESTCHECK = 1 End If Set objRE = Nothing よろしくお願いいたします。

  • 複数行をヒットさせる正規表現

    ~ 省略 ~ ==abc== ! ああ !: あいうえお ! いい !: いうえおあ ==def== ~ 省略 ~ とあった時、==abc==から==def==の間を全て取得したいのですが、 どうにも改行文字の所で止まってしまい、==abc==までしか 取得する事が出来ません。 ~ 省略 ~部分は全く同じ形式で文字列が大量にありますが、 ==abc==、==def==は1箇所にしか存在しません。 どういう正規表現をすれば上記全ての文字列を取得する事が出来るのでしょうか?

    • ベストアンサー
    • PHP
  • 正規表現についての質問です

    たとえば abc="5565" def="546434" abc="4523" def="459473" abc="3454" def="796812" というようなabcとdefの値を表す文字列があります。 サクラエディタを使い、これらの中から abc="任意の数字"という文字列をを全て選択したいのですが、 なかなかうまくいきません。 どなたかやり方を知っておられましたら教えていただけませんか。 宜しくお願いします><

専門家に質問してみよう