【Perl5】正規表現

2015年10月19日

正規表現

正規表現とは、文字列の一部をパターン化して各種処理をする手法です。

パターンマッチ演算子

Perl では、パターンマッチ演算子として
基本的には、スラッシュ(/)で囲んだ文字列が正規表現として処理されます。
よく使われる場面は、条件式や文字列の置換だったりします。
条件式で使うとすると以下のような感じになります。

構文内容
if ( 文字列 =~ /パターン/)もし「文字列」の中に「パターン」が含まれていれば
(パターンマッチすれば真)
if ( 文字列 !~ /パターン/)もし「文字列」の中に「パターン」が含まれていなければ
(パターンマッチすれば偽)

また、下記のように省略して記述することもできます。
この場合、「文字列」は、特殊変数 $_ が使われます。

構文内容
if (/パターン/)もし変数 $_ の中に「パターン」が含まれていれば
(パターンマッチすれば真)
if (!/パターン/)もし変数 $_ の中に「パターン」が含まれていなければ
(パターンマッチすれば偽)

正規表現では、区切り文字であるスラッシュを他の任意の記号に置き換えることもできます。
※「区切文字」は、空白文字以外の記号を使用することができます。
(@, #, *, |, #, {}, [], () など)

構文内容
[区切文字] パターン [区切文字]/パターン/ に同じ

パターンマッチ演算子には、オプションとして、いくつかの修飾子が実装されています。

修飾子内容
g繰り返しマッチングする (global)
i大文字と小文字の区別をしない (case-insensitive)
m文字列を複数行として扱う (multi-line)
o変数展開を 1 度だけ行う (only once)
s文字列を単一行として扱う (single line)
x拡張正規表現を行う (extended)

メタ文字

正規表現では、下記の記号をメタ文字として特殊な機能を持たせています。
なので、メタ文字を「文字」としてマッチさせるためには、
直前に \ を付けてエスケープする必要があります。

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

任意の1文字と位置指定

メタ文字正規表現上の意味
\直後の文字をエスケープ
^先頭にマッチ
$末尾にマッチ
.改行を除く任意の1文字

パターン論理和

メタ文字正規表現上の意味
|選択

複数の文字列をパイプで分割すると、複数の文字列のどれかにマッチさせます。

パターングループ

メタ文字正規表現上の意味
( )グループ化

複数の文字列をまとめた形でパターンマッチを行います。
また、パターングループでマッチした文字列は、特殊変数 ( $ + 数字 ) に
マッチした順に代入されていきます。($1, $2, $3, … )

文字クラス

メタ文字正規表現上の意味
[ ]指定内の任意表現

マッチングの対象となる文字列中に、[ ] (ブラケット)で囲んだ文字のいずれかをマッチさせます。
ブラケット中の先頭部に「 ^ 」(キャレット)があれば、逆の意味となります。
また、ブラケット中に「 – 」(マイナス)があれば、範囲指定を意味します。

文字クラスで多用されるものとして、次のような表現があります。

文字クラス内容
[a-z]英小文字のいずれか1文字
[A-Z]英大文字のいずれか1文字
[0-9]数字のいずれか1文字
[a-zA-Z0-9]英数字のいずれか1文字
[^a-zA-Z]英字以外にマッチ
[^0-9]数字以外にマッチ

量指定子

メタ文字正規表現上の意味
*直前の文字を0回以上にマッチ
+直前の文字を1回以上にマッチ
?直前の文字を0回又は1回にマッチ
{n}直前の文字をn回にマッチ
{n,}直前の文字をn回以上にマッチ
{n,m}直前の文字をn回以上、m回以下にマッチ

量指定子の正規表現を行う場合、マッチする範囲は最大マッチングとなります。

その他のメタ文字及び特殊変数

前述以外で、他にも正規表現上の特殊な意味として、よく使われるものがあります。

表現正規表現上の意味
\w英字、数字、アンダースコア。[a-zA-Z0-9_] に同じ。
\W英字、数字、アンダースコア以外の文字。[^a-zA-Z0-9_] に同じ。
\d数字。[0-9] に同じ。
\D数字以外の文字。[^0-9] に同じ。
\tタブ
\rリターン(復帰文字)
\n改行
\fラインフィード(改ページ)
\sスペース。[\r\t\n\f] に同じ。
\Sスペース以外の文字。[^\r\t\n\f] に同じ。
\aアラーム(ベル)
\bバックスペース
\eエスケープ
\0 + 数字8 進法で表すASCII文字。( \033, \040 など )
\x + 英数字16 進法で表すASCII文字。(\x1b, \x00 など )
\c[コントロール文字
\l次の 1 文字を小文字にする
\u次の 1 文字を大文字にする
\L\E までの文字列を小文字にする
\U\E までの文字列を大文字にする
\E変更の終わり
\Q\E までの文字列で正規表現のメタ文字を文字にみなす
\b単語の境界にマッチする
\B単語の境界以外にマッチする
\A文字列の最初にマッチする。メタ文字 ^ に同じ。
\Z文字列の最後にマッチする。メタ文字 $ に同じ。
$ + 数字グループ化したパターンを後で参照する。( $1, $2, $3, … )
\ + 数字上記に同じ。( \1, \2, \3, … )
$&マッチした文字列全体
$`マッチした文字列の前にあるすべての文字列
$’マッチした文字列の後にあるすべての文字列

置換演算子

正規表現を使用し、マッチした文字列を置き換える置換演算子があります。

構文内容
s/パターン/置換文字列/「パターン」にマッチする文字列を「置換文字列」に置き換える

置換演算子は省略形として、左辺を省略することもできます。
この場合、左辺は 特殊変数 $_ が充てられます。

パターンを囲む区切り文字のスラッシュを任意の区切り文字に変更することができます。
この場合、先頭の m オプションを付けることはありません。
置換演算子には、置換えを行う際のオプションとして、次の修飾子が用意されています。

修飾子内容
g繰り返しマッチする (global)
i大文字と小文字の区別をしない (case-insensitive)
m文字列を複数行として扱う (multi-line)
o変数展開を1度だけ行う (only once)
s文字列を単一行として扱う (single line)
x拡張正規表現を行う (extended)
e置換文字列を「式」と見なす (evaluation)

変換演算子

変換演算子は文字列を 1 文字ずつ順にスキャンして、
対象文字列に含まれるすべての文字を変換して、変換した文字数を返す演算子です。

構文内容
tr/変換対象の文字/変換後の文字/「変換対象の文字」をスキャンして「変換後の文字」にすべて変換する
y/変換対象の文字/変換後の文字/上に同じ。

変換演算子にも修飾子が次のとおり用意されています。

修飾子内容
c対象の文字に含まれないものを変換する
d変換する文字に含まれないものを削除する
s変換の結果、同じ文字が連続したものを1文字とする

正規表現を利用する関数

正規表現を利用する関数として、split 関数 があります。

Perl5入門

Posted by 管理人