ここでは、後方参照や先読み・戻り読みなどの正規表現について、具体例を交えながら、解説していきます。
.
\n(改行文字)を除く、任意の1文字にマッチします(見にくいかもしれませんが、「ピリオド」です)。たとえば、/.../または/.{3}/は3文字の英数字であれば、どのような文字列にもマッチします。
^
文字列の先頭を表します。文字集合の否定を表す[^・・・]と混同しないように注意する必要があります。たとえば、/^ab/は、文字列の先頭がabで始まっていれば、マッチします。一方、/[^ab]/はaでもbでもない文字があった場合にマッチします。なお、「^」は、「へ」のキーを日本語入力しない状態で入力します。
$
文字列の最後を表します。たとえば、/xyz$/は文字列の最後にxyzがあるときにマッチします。また、/^$/は「^」(文字列の先頭)で始まり、「$」(文字列の最後)で終わるということで、結果的に空の行ということになります。さらに/^\s$/とすると、文字列の先頭から文字列の最後まで、空白文字(スペースやタブなど)しかない場合にマッチします。
$1 $2・・・$9
正規表現をカッコでくくったとき、左から順にマッチした文字列を後で参照するときに利用する変数です。たとえば、/([abc][abc][abc])([0-9][0-9])/という正規表現に対し、「bcc80vvv」という文字列がマッチしたとき、$1には「bcc」が$2には「80」が入ります。
(?:正規表現)
上記のような後方参照する必要がない(つまり、後で$1,$2,$3などの変数を利用しない)場合に、そのような正規表現に対して使います。こうすれば、$1や$2等が後で何を意味するのか、わかりやすくなります。
たとえば、/^(To|From): (.*)$/という正規表現に対し、「To: abcd@pqrst.com」という文字列がマッチしたとき、$1には「To」が入り、$2には「abcd@pqrst.com」が入りますが、/^(?:To|From): (.*)$/とすると、「To: abcd@pqrst.com」という文字列がマッチしたとき、$1には「abcd@pqrst.com」が入ります。
$&
最後に実行したパターンマッチでマッチした文字列が入る変数です。たとえば、/:\d\d:/という正規表現に対し、「10:24:38」という文字列がマッチしたとき、$&には「:24:」が入ります。
$`
最後に実行したパターンマッチでマッチした部分より前の文字列が入る変数です。たとえば、/:\d\d:/という正規表現に対し、「10:24:38」という文字列がマッチしたとき、$`には「10」が入ります。なお、「`」は、「@」のキーをシフトキーを押しながら入力します。
$'
最後に実行したパターンマッチでマッチした部分より後の文字列が入る変数です。たとえば、/:\d\d:/という正規表現に対し、「10:24:38」という文字列がマッチしたとき、$'には「38」が入ります。なお、「'」は、「7」のキーをシフトキーを押しながら入力します。
(・・・・)
グループを表します。後方参照の変数$1や$2等とあわせて使います。たとえば、/(\d\d):(\d\d):(\d\d)/という正規表現に対し、「10:24:38」という文字列がマッチしたとき、$1には「10」が入り、%2には「24」が入り、%3には「38」が入ります。
|
選択を表します。たとえば、/abc|xyz/という正規表現は、abcかxyzのどちらかとマッチするかどうかを表しています。
また、/Mary|John Smith/という正規表現は、MaryまたはJohn Smithのどちらかとマッチするかどうかを表していますが、
/(Mary|John) Smith/という正規表現は、Mary SmithまたはJohn Smithのどちらかとマッチするかどうかを表しています。なお、「|」は、「\」のキーをシフトキーを押しながら入力します。
(?=正規表現)---肯定の先読み
先行する正規表現の後に、該当する正規表現が「来る」ことを表します。具体的には、/先行する正規表現(?=正規表現)/のように使います。
たとえば、/test(?=.doc|.txt)/という正規表現は、test.docとtest.txtの「test」にマッチします。
これに対し、/test(.doc|.txt)/という正規表現は、test.docやtest.txtの「test.doc」と「test.txt」にマッチします。
また、/課長(?=補佐)/という正規表現は、課長補佐の「課長」にマッチしますが、「課長」だけのときや「課長代理」にはマッチしません。
(?!正規表現)---否定の先読み
先行する正規表現の後に、該当する正規表現が「来ない」ことを表します。具体的には、/先行する正規表現(?!正規表現)/のように使います。
たとえば、/test(?!.doc|.txt)/という正規表現は、test.logやtest.batの「test」にマッチしますが、test.docとtest.txtの「test」にはマッチしません。
また、/課長(?!補佐)/という正規表現は、「課長」だけのときや「課長代理」にはマッチしますが、課長補佐の「課長」にマッチしません。
(?<=正規表現)---肯定の戻り読み
後続する正規表現の前に、該当する正規表現が「来る」ことを表します。具体的には、/(?<=正規表現)後続する正規表現/のように使います。
たとえば、/(?<=test\d{3}.)txt/という正規表現は、test123.txtやtest028.txtの「txt」にマッチしますが、test.txtやtest75.txtの「txt」にはマッチしません。
また、/(?<=副)部長/という正規表現は、副部長の「部長」にマッチしますが、「部長」だけのときや「部長補佐」にはマッチしません。
(?<!正規表現)---否定の戻り読み
後続する正規表現の前に、該当する正規表現が「来ない」ことを表します。具体的には、/(?<!正規表現)後続する正規表現/のように使います。
たとえば、/(?<!test\d{3}.)txt/という正規表現は、test.txtやtest75.txtの「txt」にマッチしますが、test123.txtやtest028.txtの「txt」にはマッチしません。
また、/(?<!副)部長/という正規表現は、「部長」だけのときや「部長補佐」にはマッチしますが、、副部長の「部長」にマッチしません。
「Proc_1button_01_requery」という文字列を$w_proc_nameに入れていた場合、 $w_proc_name =~ s/Proc_.*_//; とすると、「Proc_1button_01_」までが対象となるが、 $w_proc_name =~ s/Proc_.*?_//; とすると、「Proc_1button_」までが対象となる。