正規表現パターンの中のエスケープ処理

パターンの中には任意の文字を記述することができますが、メタ文字と呼ばれる正規表現で特殊な用途で使用される文字にはエスケープ処理が必要となります。ここでは Perl の正規表現でパターンの中の特殊な文字をエスケープする方法について解説します。

(Last modified: )

パターンの中の特別な文字のエスケープ処理

パターンの中には任意の文字を記述することができますが、メタ文字と呼ばれる特殊な用途で使用される文字にはエスケープ処理が必要となります。特殊な用途で使用される文字は次のようなものがあります。

\ * + . ? { } ( ) [ ] ^ $ - | /

これらの文字はパターンの中で使用されると特別な意味を持ちます。そこで単なる文字として扱いたい場合には "\" を使ってエスケープ処理を行います。例えば "\", "*", "|" の文字をパターンの中で文字として使いたい場合はそれぞれ次のように記述します。

\\
\*
\|

この中で "/" についてはパターンマッチ演算子の区切り文字を "/" 以外にした場合は必要ありません。(パターンマッチ演算子については「パターンマッチ演算子の区切り文字を指定する」を参照して下さい)。

また "-"についてはパターンで "[]" を使用しこの中で使用される場合にだけ特別な意味を持つため、 "[]" の中で使用される場合だけエスケープ処理が必要となります。

パターンの中のエスケープシーケンス

パターンはダブルクオーテーションで囲った文字列と同じように扱われます。その為、次のようなエスケープシーケンスも利用できます。

\a        警報音
\n        改行
\r        復帰
\f        改ページ
\t        水平タブ
\e        ESC
\ooo      8進数
\xhh      16進数
\cX       コントロール文字(\cCならCtrl+C)
\l文字    文字を小文字
\u文字    文字を大文字
\L...\E   ...を小文字
\U...\E   ...を大文字
\Q...\E   ...の中のメタ文字をエスケープ

また $ 及び @ についてはメタ文字としての使用や、パターンの中に変数や配列を展開する時にも使用される文字のため注意が必要です。また詳しい解説は別のページで行います。

他にも特別な意味を持つエスケープシーケンスが用意されていますが、必要になった時に随時解説していきます。

サンプルコード

それでは簡単なサンプルを作成します。

use strict;
use warnings;
use utf8;
binmode STDIN, ':encoding(cp932)';
binmode STDOUT, ':encoding(cp932)';
binmode STDERR, ':encoding(cp932)';

my $str1 = "[the]";
my $str2 = "AA\tBB";

if ($str1 =~ /\[t/){
  print $str1."は /\\[t/ とマッチします\n";
}else{
  print $str1."は /\\[t/ とマッチしません\n";
}

if ($str2 =~ /A\tB/){
  print $str2."は /A\\tB/ とマッチします\n";
}else{
  print $str2."は /A\\tB/ とマッチしません\n";
}

テキストエディタでプログラムを記述したあと sample.pl という名前で保存します。(文字コードは UTF-8 です)。コマンドプロンプトを起動し、プログラムを保存したディレクトリへ移動したあとで次のように実行します。

perl sample.pl

次のように実行結果が表示されます。

正規表現パターンの中のエスケープ処理(1)

最初のパターンの中で特別な意味を持つ "[" をエスケープして文字としての "[" としてマッチすかどうか調べました。次のパターンでは水平タブを表す "\t" のようなエスケープシーケンスをパターンで記述しマッチするかどうか調べました。

-- --

Perl でリストを作成する方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。