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

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

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

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

(例1)
$_ = "test1test2test3Test4";              # パターンマッチ対象文字列

if (/Test\d/)                             # 先頭が大文字のパターン
{
    print "$&\n";                         # "Test4" にマッチ
}

if (/Test\d/i)                            # 大文字小文字を区別しないマッチ
{
    print "$&\n";                         # "test1" にマッチ
}
実行結果
Test4
test1

(例2)
$_ = "test1test2test3Test4";              # パターンマッチ対象文字列

@a_test = ();

if (@a_test = /(test\d)/)                 # "test + 整数" のパターン
{
    print "@a_test\n";                    # 結果として "test1" のみを返す
}

if (@a_test = /(test\d)/g)                # "g" を指定して全てのマッチを試みる
{
    print "@a_test\n";                    # 結果として "test1" 〜 "test3" を返す
}
実行結果
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";             # パターンマッチ対象文字列

@a_test = /(^test3)/;                      # 行頭の "test3" にマッチを試みる

print "@a_test\n";                         # "test3" は行頭と認識されないのでマッチしない

@a_test = /(^test3)/s;                     # "s" を指定して行頭の "test3" にマッチを試みる

print "@a_test\n";                         # パターンは全て同一行と解釈され "test3" は行頭と認識されず
                                           # マッチしない

@a_test = /(^test3)/m;                     # "m" を指定して行頭の "test3" にマッチを試みる

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";                    # パターンマッチ対象文字列1
$ptn2 = "test1test2";                    # パターンマッチ対象文字列2

$ptn1 =~ s/test1/"test" . "0"/;          # 置換文字列に式を利用
{
    print "$ptn1\n";                     # 式を評価せずそのまま表示
}

$ptn2 =~ s/test1/"test" . "0"/e;         # "e" を指定して置換文字列に式を利用
{
    print "$ptn2\n";                     # 式を評価した結果を表示
}
実行結果
"test" . "0"test2
test0test2


Copyright(C) 2006-2011 CLAYPOT. All Rights Reserved.