単語単位の論理積の否定?(先読みの正規表現)
タイトルを見てもなんのことかさっぱりわからないと思います。
自分でもどう説明すればいいのかわかりませんので、簡単な例を。
そんな時の正規表現です。
#!/usr/bin/perl use utf8; use Encode; use Test::More tests => 5; # 悟空と悟飯は強いから嫌な正規表現! my $regex = "孫(?!(悟空|悟飯))"; print encode_utf8("強いヤツと闘いたい!\n"); like("孫悟天", qr/$regex/,encode_utf8("悟天なら大丈夫かも?")); unlike("孫悟空", qr/$regex/,encode_utf8("悟空は強いからいや!")); unlike("孫悟飯", qr/$regex/,encode_utf8("悟飯も強いからいや!")); like("孫", qr/$regex/,encode_utf8("ただの孫さんなら闘う!")); like("孫正義", qr/$regex/,encode_utf8("VS Softbank!"));
以下、実行結果です。
localhost% perl regex.pl 1..5 強いヤツと闘いたい! ok 1 - 悟天なら大丈夫かも? ok 2 - 悟空は強いからいや! ok 3 - 悟飯も強いからいや! ok 4 - ただの孫さんなら闘う! ok 5 - VS Softbank!
使用している「?!」は、先読みの正規表現というらしいです。(「?=」の否定条件)
イマイチこの言葉は理解出来ていません。。(先読み???)
*実際には文章中にある、「サーバー」ではない「サーバ」や、「コンピューター」ではない「コンピュータ」を、一つの正規表現でマッチングさせたかったのでした。