正規表現の否定 #2
ちょいと考えてみたんだけど、任意の正規表現にマッチしない正規表現ってのはこうすれば作れるんではないだろうか。
sub negative_regexp { my ($re) = @_; return qr/\A(?!$re)(?:.(?!$re))*\Z/s; }
適当にモジュール化して適当にテストを書いてみたけどどうだろう。まぁ、テストが全然足りないんだけども。
とりあえず、dankogai さんあたりがツッコミを入れてくれると期待。いや、実は全然既知のネタというオチがありそうだけども。
package Regexp::Negative; use warnings; use strict; use Carp; use version; our $VERSION = qv('0.0.1'); use base qw(Exporter); our @EXPORT = qw(negative_regexp); sub negative_regexp { my ($re) = @_; return qr/\A(?!$re)(?:.(?!$re))*\Z/s; } 1;
use strict; use Test::More qw(no_plan); use Regexp::Negative; *nr = \&negative_regexp; unlike( 'foo', nr(qr/foo/) ); unlike( 'foo', nr(qr/f.o/) ); like( 'bar', nr(qr/f.o/) ); unlike( 'foobar', nr(qr/foo/) ); unlike( 'foobar', nr(qr/bar/) ); like( '', nr(qr/./) ); unlike( 'z', nr(qr/./) ); like( '', nr(qr/\b/) ); unlike( 'a', nr(qr/\b/) );
追記
id:inabahiroto さんからご指摘。こちらのほうがよさそう。
sub negative_regexp { my ($re) = @_; return qr/\A(?!.*$re)/s; }
あと正規表現に s フラグを追加。