みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

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

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

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

投稿日時 - 2002-02-15 12:03:52

QNo.218218

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.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)で確認しました。

投稿日時 - 2002-02-15 21:28:02

お礼

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

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

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

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

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

投稿日時 - 2002-02-16 20:44:38

ANo.1

2nd

この場で、詳細に説明することは私には難しいので
割愛させていただきます。
#混乱させるだけになりますので。

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

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

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

それでは。

投稿日時 - 2002-02-15 13:32:24

お礼

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

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

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

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

投稿日時 - 2002-02-16 20:40:58

あなたにオススメの質問