Loose-Info.com

Last Update 2019/12/25


TOP - Perl - 正規表現 - 変更子

パターンマッチ及び検索置換の処理方法を変更する際に、デリミタの最後に付けて使用します。
複数の機能を組み合わせて利用することも可能です。

パターンマッチ・検索置換共通

i : 大文字小文字を区別しない g : 最初にマッチしたところで止めず、全てのマッチを試みる s : 対象文字列を全て同一行として処理する m : 対象文字列を全て複数行として処理する o : 変数などを利用して繰り返しパターンを利用する場合などに、パターンを固定と解釈し、評価を1度のみとする x : コメントと空白文字を使えるようにするなど、拡張表現の使用を可能にする

検索置換のみ
e : 置換文字部分を式として評価する

(例1)
$_ = "test1test2test3Test4"; # 先頭が大文字のパターン if (/Test\d/) { print "$&\n"; } # 大文字小文字を区別しないマッチ if (/Test\d/i) { print "$&\n"; }

実行結果
Test4 test1

(例2)
$_ = "test1test2test3Test4"; @a_test = (); # "test + 整数" のパターン if (@a_test = /(test\d)/) { print "@a_test\n"; } # "g" を指定して全てのマッチを試みる if (@a_test = /(test\d)/g) { print "@a_test\n"; }

実行結果
test1 test1 test2 test3

(例3)
$_ = "test1test2test3Test4"; @a_test = /( test1| # "test1" のマッチを試みる(ここは正規表現のコメント) test2 # "test2" のマッチを試みる(ここは正規表現のコメント) )/; print "@a_test\n"; # コメントや空白がパターンと認識されるためマッチしない @a_test = /( test1| # "test1" のマッチを試みる(ここは正規表現のコメント) test2 # "test2" のマッチを試みる(ここは正規表現のコメント) )/x; print "@a_test\n"; # "x" を指定したため空白文字及びコメントが認識される # 最初にマッチした "test1" が返される

実行結果
test1

(例4)
$_ = "test1test2\ntest3Test4"; # 行頭の "test3" にマッチを試みる @a_test = /(^test3)/; print "@a_test\n"; # "test3" は行頭と認識されないのでマッチしない # "s" を指定して行頭の "test3" にマッチを試みる @a_test = /(^test3)/s; print "@a_test\n"; # パターンは全て同一行と解釈され "test3" は行頭と認識されずマッチしない # "m" を指定して行頭の "test3" にマッチを試みる @a_test = /(^test3)/m; print "@a_test\n"; # パターンは複数行と解釈され "test3" は行頭と認識されるのでマッチする

実行結果
test3

(例5)
$_ = "test1test2\ntest3Test4"; $s_test1 = "test1"; $s_test2 = "test2"; $n = 0; $n_time_s = time(); for ($i=0; $i<1000000; $i++) { if (/($s_test1|$s_test2|test)($s_test1|$s_test2|test1)/) { $n++; } } print "ループ $n回(パターン再評価有り) 所要時間 : " . (time() - $n_time_s) . "秒\n"; $n = 0; $n_time_s = time(); for ($i=0; $i<1000000; $i++) { if (/($s_test1|$s_test2|test)($s_test1|$s_test2|test1)/o) { $n++; } } print "ループ $n回(パターン再評価無し) 所要時間 : " . (time() - $n_time_s) . "秒\n";

実行結果(FreeBSD)
ループ 1000000回(パターン再評価有り) 所要時間 : 8秒 ループ 1000000回(パターン再評価無し) 所要時間 : 4秒

実行結果(Windows)
ループ 1000000回(パターン再評価有り) 所要時間 : 5秒 ループ 1000000回(パターン再評価無し) 所要時間 : 5秒

(例6)
$ptn1 = "test1test2"; $ptn2 = "test1test2"; # 置換文字列に式を利用 $ptn1 =~ s/test1/"test" . "0"/; { print "$ptn1\n"; # 式を評価せずそのまま表示 } # "e" を指定して置換文字列に式を利用 $ptn2 =~ s/test1/"test" . "0"/e; { print "$ptn2\n"; # 式を評価した結果を表示 }

実行結果
"test" . "0"test2 test0test2