正規表現について、おたずねします。

文字列 abc,def,ghi のいずれかにマッチする正規表現は (abc|def|ghi) ですよね。
それでは、「abc,def,ghi のいずれにもマッチしない」正規表現は、どう書けばいいのでしょうか?
あちこち調べましたが、どうしてもわかりません。

ただし、if $a =~ /(abc|def|ghi)/ などで、=~ を !~ に直す、というのはナシです。あくまでも右辺の式の中で表現したいのですが…

A 回答 (2件)

この場で、詳細に説明することは私には難しいので


割愛させていただきます。
#混乱させるだけになりますので。

ご自身でお調べいただくか、識者のご登場に期待してください。

ともかく、こんな感じでできているでしょうか?
#若干不十分かも知れません。

/(?=^(?:(?!abc).)*$)(?=^(?:(?!def).)*$)(?=^(?:(?!ghi).)*$)/s

それでは。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

例の通りにやってみたら、意図する動作ができました!

私も Perl を使って結構長いんですが、この ?= とか ?: とか ?! が、まだイマイチよく理解できないんですよ。ラクダ本見ても、例があまりなくてよくわからないし…

もう少し、あちこち当たって勉強してみます。

お礼日時:2002/02/16 20:40

/[^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)で確認しました。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

> [^a]bc|[^d]ef|[^g]hi/

実際には abc/def/ghi というのはドメイン名(FQDN)でもっと複雑で長い文字列になるので、この方法ではちょっとダメそうです。

やはり ?: や ?! を使うのでしょうが、2番目の例は、こちらで試した限りでは、うまくいきませんでした。

もう少し、いろいろ調べてみます。

お礼日時:2002/02/16 20:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング