正規表現

■正規表現
・過去扱ってきた言語に正規表現などと言うものは存在しなかった。
上手く使うと非常に便利である。
(パターンマッチ、パターンマッチング)
以下、簡単にまとめておく。
■マッチパターン演算子
i     大文字、小文字の区別なし
s     単一行として処理 (^、$ は、\n を無視)
m     複数行として処理 (^、$ は、行先頭、行末尾)
x     空白を無視、# をコメント処理
■メタ文字
.     改行を除く任意の 1 文字
*     0 回以上のパターン繰り返し
+     1 回以上のパターン繰り返し
?     0 または 1 回のパターン
^     先頭から
$     末尾から
\     メタ文字クォート
|     パターン論理和
()    パターングループ
[]    文字クラス
{}    量指定子
\n    改行                          文字クラスでも指定可
\r    キャリッジリターン            文字クラスでも指定可
\f    ラインフィード                文字クラスでも指定可
\t    タブ                          文字クラスでも指定可
\d    数字 [0-9]                    文字クラスでも指定可
\D    数字以外 [^0-9]
\w    英数字単語 [_a-zA-Z0-9]       文字クラスでも指定可
\W    英数字単語以外 [^_a-zA-Z0-9]
\s    空白 [ \t\n\r\f]              文字クラスでも指定可
\S    空白以外 [^ \t\n\r\f]
\b    単語境界 \w、\W の間          文字クラスでも指定可
\B    単語境界以外
\x??  16 進数
■文字クラス
–     範囲
^     先頭に置くと以外にマッチ
/[0123456789]/        数字にマッチ
/[0-9]/               数字にマッチ
/[^0-9]/              数字以外にマッチ
/[a-zA-Z]/            英字にマッチ
/[a-fA-F\d]/          16 進数にマッチ
■量指定子
{}?   最短マッチ(? がないと最長マッチになる)
*                     0 回以上のパターン繰り返し
+                     1 回以上のパターン繰り返し
?                     0 または 1 回のパターン
{n}?                  n 回繰り返しマッチ
{n,}?                 n 回以上繰り返しマッチ
{n, m}?               n 回以上、m 回以下繰り返しマッチ
■例
/abc/                 abc にマッチ
/a.c/                 a?c にマッチ
/a(bb|b1|b2)c/        abbc、ab1c、ab2c にマッチ
/^abc/                abc で始まるとマッチ
/abc$/                abc で終わるとマッチ
/^$/                  空行とマッチ
/ab?c/                ac、abc にマッチ
/a.*c/                ac、abc、ab1c などにマッチ
/a.+c/                abc、ab1c などにマッチ
/[0-9]{1, 2}/         0 ~ 99 にマッチ
/[a-zA-Z]{8,}/        英字 8 文字以上にマッチ
/あいうえお{2}/       「あいうえおお」にマッチ
/(あいうえお){2}/     「あいうえおあいうえお」にマッチ
■マッチ演算子
m/マッチパターン/
c     g と併せて使用し、失敗時の位置リセット禁止
g     マッチするものすべて
i     大文字、小文字の区別なし
s     単一行マッチ
m     複数行マッチ
o     パターンコンパイル
x     空白を無視、# をコメント処理
$1, $2, …  () の n 番目マッチ文字列
mce_markeramp;           正規表現マッチ部分

マッチ部分の前

マッチ部分の後

$+           最後の () にマッチした文字列
if ($s =~ m/abc/i) { マッチ処理; }
■置換演算子
s/マッチパターン/置換文字列/
e     置換文字列を式とする
g     マッチするものすべて
i     大文字、小文字の区別なし
s     単一行マッチ
m     複数行マッチ
o     パターンコンパイル
x     空白を無視、# をコメント処理
$s =~ s/abc/123/i;        #// abc を 123 に
$s =~ s/</&lt;/g;     #// < を &lt; に
$s =~ s/(.)\1/$1/g;       #// 連続文字を 1 文字に
$s =~ s/abc//g;           #// abc を削除(指定文字を取り除く)
$s =~ s/\@//g;            #// @ マークを削除
#// 教えてもらった凝ったやつ1 (_?_…__ にマッチ)
$s = ‘_a_あい_うえお__かきくけこ_b_さしすせそ__’;
$s =~ s/_._([^_]+|([^_]+_[^_]+)+)__/start$1end/g;
startあい_うえおendかきくけこstartさしすせそend
#// 教えてもらった凝ったやつ2 (最短マッチを使う手 Perl5 以降)
$s = ‘_a_あい_うえお__かきくけこ_b_さしすせそ__’;
$s =~ s/_._([\s\S]*?)__/start$1end/g;
startあい_うえおendかきくけこstartさしすせそend
■変換演算子
tr/対象リスト/変換リスト/
c     対象リストに含まれないものを変換
d     変換リストに含まれないものを削除
s     連続文字を 1 文字に変換
$s =~ tr/A-Z/a-z/;        #// 英子文字に変換
$s =~ tr/0-9a-zA-Z/_/c;   #// 英数字以外を _ に変換
$s =~ tr/a-zA-Z//d;       #// 英字を削除
$s =~ tr/a-zA-Z//cd;      #// 英字以外を削除
■grep
@rec = grep(/abc/, @rec);
@rec = grep(/マッチパターン/, @rec);
@rec = grep {/abc/} @rec;
@rec = grep {論理式} @rec;