Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
  • 締切済み

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

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

みんなの回答

  • 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