正規表現
文字列の集合を一つの文字列で表現する方法の一つです。Perlの場合は他の言語に比べて非常に強力な正規表現によるパターンマッチ機能を備えており、文字列の集合を表現することができ、正規表現にマッチする文字列を検索したり、置換したりすることができます。
パターンマッチ
パターンマッチとは正規表現で表した文字の集合が対象の文字列に含まれているかを調べる操作のことをいいます。パターンマッチを行うにはパターンマッチ演算子を使用します。
# パターンマッチ
$str =~ /正規表現/
パターンマッチ演算子は「=~」です。正規表現はスラッシュ「/」で囲む必要があります。マッチした場合は真を、マッチしなかった場合は偽を返します。一般的にパターンマッチはif文と組み合わせて利用します。
構文 | 内容 |
if ( 文字列 =~ /パターン/) | もし「文字列」の中に「パターン」が含まれていれば(パターンマッチすれば真) |
if ( 文字列 !~ /パターン/) | もし「文字列」の中に「パターン」が含まれていなければ(パターンマッチすれば偽) |
if ($str =~ /正規表現/) {
# マッチした場合の処理
}
$str = 'japan';
if ($str =~ /a/) {
print "含まれています。";
} else {
print "含まれていません。";
}
> 含まれています。
構文の省略形の位置づけとして、次の構文があります。この場合、対象となる「文字列」は特殊変数 $_ が充てられます。
構文 | 内容 |
if (/パターン/) | もし変数 $_ の中に「パターン」が含まれていれば(パターンマッチすれば真) |
if (!/パターン/) | もし変数 $_ の中に「パターン」が含まれていなければ (パターンマッチすれば偽) |
$_ = 'japan';
if (/a/) {
print "含まれています。";
} else {
print "含まれていません。";
}
> 含まれています。
正規表現は通常スラッシュ ( / ) で囲んだ部分がパターンマッチの対象となりますが、このスラッシュを他の任意の記号に置き換えることもできます。
構文 | 内容 |
m [区切文字] パターン [区切文字] | /パターン/ に同じ |
$str = '東京都千代田区';
if ($url =~ m|千代田区|) {
print "含まれています。\n";
} else {
print "含まれていません。\n";
}
> 含まれています。
正規表現文字
文字の集合を表す正規表現には次のようなものがあります。
. | 改行を除くすべての文字 |
\d | 数字 |
\D | 数字以外の文字 |
\w | ワード文字(「a~z」「A~Z」「0~9」 アンダーバー「_」) |
\W | ワード文字以外の文字 |
\s | 空白文字( スペース「 」、タブ文字「\t」、改行文字「\n, \r」など) |
\S | 空白文字以外の文字 |
^ | 文字列の先頭 |
$ | 文字列の末尾 |
\b | ワード文字の境界 |
パターンマッチ演算子には置換演算子と類似した、次の修飾子オプションが用意されています。
修飾子 | 内容 |
g | 繰り返しマッチする (global) |
i | 大文字と小文字の区別をしない (case-insensitive) |
m | 文字列を複数行として扱う (multi-line) |
o | 変数展開を1度だけ行う (only once) |
s | 文字列を単一行として扱う (single line) |
x | 拡張正規表現を行う (extended) |
利用例
#■ i修飾子
$str = 'japan';
if ($str =~ /A/) {
print "マッチします。";
} else {
print "マッチしません。";
}
> マッチしません。
$str = 'japan';
if ($str =~ /A/i) {
print "マッチします。";
} else {
print "マッチしません。";
}
> マッチします。
#■ m修飾子 ^文字列の先頭
$str = "AAA\nBBB";
if ($str =~ /^B/) {
print "マッチします。";
} else {
print "マッチしません。";
}
> マッチしません。
$str = "AAA\nBBB";
if ($str =~ /^B/m) {
print "マッチします。";
} else {
print "マッチしません。";
}
> マッチします
#■ $ の使用例 文字列の末尾
$str = "japan";
if ($str =~ /n$/) {
print "マッチします。";
} else {
print "マッチしません。";
}
> マッチします
#■ 文字列をパイプで分割すると、いずれかの文字列にマッチ比較できます
$str = "japan";
if ($str =~ /a|b|c/) {
print "マッチします。";
} else {
print "マッチしません。";
}
> マッチします
[ ] を使った文字クラス
正規表現で角括弧 [ ] は特別な意味を持つメタ文字で [ ] の中身に任意の文字を列挙することで、パターンを記述する事ができます。
$str = 'japan';
if ($str =~ /[a-z]/) {
print "英小文字が含まれています。\n";
} else {
print "英小文字は含まれていません。\n";
}
> 英小文字が含まれています。
if ($str =~ /[0-9]/) {
print "数字が含まれています。\n";
} else {
print "数字は含まれていません。\n";
}
> 数字は含まれていません。
文字クラス | 内容 |
[a-z] | 英小文字のいずれか1文字 |
[A-Z] | 英大文字のいずれか1文字 |
[0-9] | 数字のいずれか1文字 |
[a-zA-Z0-9] | 英数字のいずれか1文字 |
[^a-zA-Z] | 英字以外にマッチ |
[^0-9] |
正規表現で角括弧 [ ] は特別な意味を持つメタ文字で [ ] の中身に任意の文字を列挙することで、パターンを記述する事ができます。
$str = 'japan';
if ($str =~ /[a-z]/) {
print "英小文字が含まれています。\n";
} else {
print "英小文字は含まれていません。\n";
}
> 英小文字が含まれています。
if ($str =~ /[0-9]/) {
print "数字が含まれています。\n";
} else {
print "数字は含まれていません。\n";
}
> 数字は含まれていません。
文字クラス | 内容 |
[a-z] | 英小文字のいずれか1文字 |
[A-Z] | 英大文字のいずれか1文字 |
[0-9] | 数字のいずれか1文字 |
[a-zA-Z0-9] | 英数字のいずれか1文字 |
[^a-zA-Z] | 英字以外にマッチ |
[^0-9] |
量指定子
#{ } の使用例
$str = 'japan';
if ($str =~ /[a-z]{5}/) {
print "マッチします。\n";
} else {
print "マッチしません。\n";
}
> マッチします
メタ文字 | 正規表現上の意味 |
* | 直前の文字を0回以上にマッチ |
+ | 直前の文字を1回以上にマッチ |
? | 直前の文字を0回又は1回にマッチ |
{n} | 直前の文字をn回にマッチ |
{n,} | 直前の文字をn回以上にマッチ |
{n,m} | 直前の文字をn回以上、m回以下にマッチ
メタ文字
メタ文字と呼ばれる特殊な意味を持つ文字には、そのままではマッチできないため、必ず直前に \ を付加してエスケープする必要があります。
メタ文字 \ ^ . $ * ? | ( ) [ ] { }
置換
正規表現を使ってマッチした文字列を置換することができます。置換の構文は次のようになります。
置換演算子#置換
対象文字列 =~ s/正規表現/置換後の文字列/
# マッチしたすべての文字列を置換
対象文字列 =~ s/正規表現/置換後の文字列/g;