正規表現(3) 検索オプション /o

昨日に引き続き、Perlでの正規表現を勉強します。検索パターンは「m//」演算子で記述できるのでした。

m/Apple|Banana/

このパターンの場合、「Apple」「Banana」にはマッチしますが、「apple」や「BANANA」にはマッチしません。パターンは大文字小文字を厳格に区別するのです。
例えば

m/Apple|APPLE|apple|Banana|BANANA|banana/

や、[ ] で文字クラス*1を使って

m/[Aa][Pp][Pp][Ll][Ee]|[Bb][Aa][Nn][Aa][Nn][Aa]/

のように書けばマッチするようになりますが……面倒ですね。(^_^;)

そこで、検索オプション(/o 修飾子 : スラッシュ・オー・しゅうしょくし)の出番です。検索パターンの最後の「/」(スラッシュ*2)の、さらに後ろに「正規表現パターンの挙動を制御する為の検索オプション」を指定する事ができます。
「/i」オプションを用いると、「大文字小文字を区別しなくなる」ようになります。先ほどのパターンにこのオプションを付ける場合、以下のように書きます。

m/Apple|Banana/i

コードを書いて試してみましょう。

use strict;
 
my $text = "I LOVE A FRESH APPLE SO MUCH!
An apple pie and banana juice as well.
They are so lovely.";
print "$text\n\n";
 
print "m/Apple|Banana/  ... ";
if ($text =~ m/Apple|Banana/) {
    print "Matched\n";
} else {
    print "Not matched\n";
}
 
print "m/Apple|Banana/i ... ";
if ($text =~ m/Apple|Banana/i) {
    print "Matched\n";
} else {
    print "Not matched\n";
}

$text の文章には「APPLE」「apple」「banana」はあっても「Apple」「Banana」はありません。この文章に「m/Apple|Banana/」という検索パターンを、/i オプションを付けた場合と付けない場合でマッチするか試しています。
以下が実行結果です。

I LOVE A FRESH APPLE SO MUCH!
An apple pie and banana juice as well.
They are so lovely.

m/Apple|Banana/  ... Not matched
m/Apple|Banana/i ... Matched

/i オプションを付けるとマッチしていますね。

最後に「i」と付けただけなのに、「apple」にも「BANANA」にも「ApPlE」にも「bANANa」にもマッチするようになります。とても便利です。(^_^)

*1:[abc]で"a"か"b"か"c"のどれか1文字にマッチします。[a-z]で英小文字1文字、[^abc]で"a" "b" "c"以外の何か1文字にマッチします。

*2:頭に m と付けた場合はスラッシュ以外の文字をパターン区切りとして使えるのでしたね。その場合は最後の区切りの後になります。