Perl 正規表現

正規表現(regular expression)は、文字列のマッチングパターンを記述するものです。文字列が特定の部分文字列を含むかどうかを調べたり、マッチした部分文字列を置換したり、文字列から条件に合う部分文字列を抽出したりするために使用できます。

Perl言語の正規表現は非常に強力で、基本的に一般的に使われている言語の中で最も強力です。多くの言語が正規表現サポートを設計する際に、Perlの正規表現を参考にしています。

Perlの正規表現には3つの形式があり、それぞれマッチ、置換、変換です:

  • マッチ: m//(さらに / と簡略化でき、/ としてmを省略できます)

  • 置換: s///

  • 変換: tr///

この3つの形式は通常、=~ 或 !~=~ や !~ と組み合わせて使用します。=~ はマッチを表し、!~ はマッチしないことを表します。


マッチ演算子

マッチ演算子 m// は、文字列文または正規表現をマッチするために使用します。例えば、スカラ変数 $bar 内の "run" をマッチするには、コードは次のようになります:

例

#!/usr/bin/perl $bar = "I am サンプル site. welcome to サンプル site."; if ($bar =~ /run/){ print "1回目のマッチ\n"; }else{ print "1回目のマッチ失敗\n"; } $bar = "run"; if ($bar =~ /run/){ print "2回目のマッチ\n"; }else{ print "2回目のマッチ失敗\n"; }

上記のプログラムを実行すると、出力結果は次のようになります:

第1回マッチング

パターンマッチ修飾子

パターンマッチには一般的に使われる修飾子がいくつかあります。次の表のとおりです:

修飾子説明
iパターン内の大文字と小文字を無視します
m 複数行モード
o一度だけ代入します
s単一行モード。"." は "\n" にマッチします(デフォルトではマッチしません)
xパターン内の空白を無視します
gグローバルマッチ
cgグローバルマッチが失敗した後、再度マッチ文字列を検索できるようにします

正規表現変数

Perlは処理完了後、マッチした値を3つの特別な変数名に格納します:

  • $`: マッチした部分より前の文字列
  • $&: マッチした文字列
  • $': まだマッチしていない残りの文字列

この3つの変数を合わせると、元の文字列が得られます。

例は次のとおりです:

例

#!/usr/bin/perl $string = "welcome to サンプル site."; $string =~ m/run/; print "マッチ前の文字列:$`\n"; print "マッチした文字列: $&\n"; print "マッチ後の文字列:$'\n";

上記のプログラムを実行すると、出力結果は次のようになります:

匹配前的字符串: welcome to 
匹配的字符串: run
匹配后的字符串: oob site.

置換演算子

置換演算子 s/// はマッチ演算子の拡張で、指定した文字列を新しい文字列に置換します。基本形式は次のとおりです:

s/PATTERN/REPLACEMENT/;

PATTERN はマッチパターン、REPLACEMENT は置換する文字列です。

例えば、次の文字列の "google" を "サンプル" に置換します:

例

#!/usr/bin/perl $string = "welcome to google site."; $string =~ s/google/サンプル/; print "$string\n";

上記のプログラムを実行すると、出力結果は次のようになります:

welcome to サンプル site.

置換演算子修飾子

置換演算子の修飾子は次の表のとおりです:

修飾子説明
i修飾子に"i"を追加すると、正規表現は大文字と小文字の区別をしなくなります。つまり、"a" と "A" は同じになります。
mデフォルトでは、正規表現の開始"^"と終了"$"は正規表現文字列全体に対してのみ機能します。修飾子に"m"を追加すると、開始と終了は文字列の各行を指すようになります。各行の先頭が"^"、末尾が"$"になります。
o式は一度だけ実行されます。
s修飾子に"s"を追加すると、デフォルトで"."が表す「改行以外の任意の文字」は、任意の文字になります。つまり改行も含みます!
xこの修飾子を追加すると、エスケープされていない限り、式内の空白文字は無視されます。
gマッチしたすべての文字列を置換します。
e置換文字列を式として扱います

変換演算子

以下は変換演算子に関連する修飾子です:

修飾子説明
c指定されていないすべての文字を変換します
d指定されたすべての文字を削除します
s同じ出力文字が複数ある場合、1つにまとめます

次の例では、変数 $string 内のすべての小文字を大文字に変換します:

例

#!/usr/bin/perl $string = 'welcome to サンプル site.'; $string =~ tr/a-z/A-Z/; print "$string\n";

上記のプログラムを実行すると、出力結果は次のようになります:

WELCOME TO サンプル SITE.

次の例では、/s を使用して変数 $string 内の繰り返し文字を削除します:

例

#!/usr/bin/perl $string = 'サンプル'; $string =~ tr/a-z/a-z/s; print "$string\n";

上記のプログラムを実行すると、出力結果は次のようになります:

runob

その他の例:

$string =~ tr/\d/ /c;     # 把所有非数字字符替换为空格
$string =~ tr/\t //d;     # 删除tab和空格
$string =~ tr/0-9/ /cs    # 把数字间的其它字符替换为一个空格。

その他の正規表現ルール

式 説明
. 改行以外のすべての文字にマッチします
x? x 文字列に0回または1回マッチします
x* x 文字列に0回以上マッチしますが、可能な限り最小の回数にマッチします
x+ x 文字列に1回以上マッチしますが、可能な限り最小の回数にマッチします
.* 任意の文字に0回以上マッチします
.+ 任意の文字に1回以上マッチします
{m} 指定した文字列のちょうど m 個にマッチします
{m,n}指定した文字列の m 個以上、n 個以下にマッチします
{m,} 指定した文字列の m 個以上にマッチします
[] [] 内のいずれかの文字にマッチします
[^][] 内に含まれない文字にマッチします
[0-9]すべての数字文字にマッチします
[a-z] すべての小文字英字にマッチします
[^0-9] すべての非数字文字にマッチします
[^a-z]すべての非小文字英字にマッチします
^ 文字列の先頭にマッチします
$文字列の末尾にマッチします
\d 1つの数字文字にマッチします。[0-9] と同じ構文です
\d+ 複数の数字文字列にマッチします。[0-9]+ と同じ構文です
\D 非数字です。その他は \d と同じです
\D+ 非数字です。その他は \d+ と同じです
\w 英字または数字の文字列にマッチします。[a-zA-Z0-9_] と同じ構文です
\w+ [a-zA-Z0-9_]+ と同じ構文です
\W 英字または数字以外の文字列にマッチします。[^a-zA-Z0-9_] と同じ構文です
\W+ [^a-zA-Z0-9_]+ と同じ構文です
\s 空白文字。[\n\t\r\f] と同じ構文です
\s+ [\n\t\r\f]+ と同じです
\S 非空白文字。[^\n\t\r\f] と同じ構文です
\S+ [^\n\t\r\f]+ と同じ構文です
\b 英字または数字を境界とする位置にマッチします
\B 英字または数字を境界としない位置にマッチします
a|b|c a 文字、b 文字、または c 文字のいずれかにマッチする文字列
abcabc を含む文字列にマッチします
/pattern/i (pattern) () という記号は、見つけた文字列を記憶する非常に実用的な構文です。最初の () 内で見つけた文字列は $1 変数または \1 変数になります。2番目の () 内で見つけた文字列は $2 変数または \2 変数になります。以降も同様に続きます。

その他の参考情報

\ pattern パターン内で "*" のような特殊文字を探す場合は、その文字の前に \ 記号を付けます。これにより特殊文字が無効になります。https://www.example.com/regexp/regexp-tutorial.html

その他の参考情報https://perldoc.perl.org/perlre#Regular-Expressions

正規表現: