perlrebackslash - Perl 正規表現逆スラッシュシーケンスとエスケープ
Perl 正規表現に関する最上位文書は perlre です。
この文書は全ての逆スラッシュシーケンスとエスケープシーケンスについて 記述します。 逆スラッシュの役割について説明したあと、Perl 正規表現の中で特別な意味を持つ 全てのシーケンスを(アルファベット順に)示し、それぞれについて記述します。
ほとんどのシーケンスは他の文書に詳細に記述されています; この文書の主な目的は 全ての逆スラッシュシーケンスとエスケープシーケンスを記述した クイックリファレンスガイドとなることです。
正規表現において、逆スラッシュは二つのタスクのどちらかを行います:
引き続く文字の特殊な意味を取り除く(例えば、(\|
は代替ではなく、垂直バーに
マッチングします)か、逆スラッシュシーケンスまたはエスケープシーケンスの
開始となります。
これが何かを決定する規則はかなり単純です: 逆スラッシュに引き続く文字が 句読点(非単語)文字(これは英字、数字、下線以外の全ての文字)なら、 逆スラッシュは引き続く文字の特別な意味を(もしあるなら)取り除きます。
逆スラッシュに引き続く文字が英字または数字なら、この並びは特別です; その場合、以下に示します。 いくつかの文字はまだ使われておらず、これを逆スラッシュでエスケープするのは 今のところは安全ですが、将来のバージョンの Perl はこれに特別な意味を 割り当てるかもしれません。 しかし、警告が有効なら、そのような並びを使うと Perl は警告を出力します。 [1]。
しかし、逆スラッシュシーケンスやエスケープシーケンスが逆スラッシュの後に 句読点文字がくることがないことは今だけではなく将来のバージョンの Perl 5 でも保証されています。 従って、非単語文字の前に逆スラッシュを置くのは安全です。
逆スラッシュ自体が特別であることに注意してください; 逆スラッシュと
マッチングしたいなら、逆スラッシュを逆スラッシュでエスケープする必要が
あります: /\\/
は単一の逆スラッシュにマッチングします。
一つの例外があります。 パターンの区切りとして英数字を使っている(おそらくこれは可読性の理由で するべきではありません)場合、その文字にマッチングしたいなら区切り文字を エスケープする必要があります。 Perl は警告を出しません。 Gory details of parsing quoted constructs in perlop も参照してください。
\000 8 進数エスケープシーケンス。 \1 絶対後方参照。 \a アラームまたはベル。 \A 文字列の先頭。 \b 単語/非単語境界。(文字クラス中なら後退)。 \B 単語/非単語境界でない。 \cX Control-X (X は任意の ASCII 文字)。 \C UTF-8 の下でも、単一のオクテット。 \d 数字のための文字クラス。 \D 非数字のための文字クラス。 \e エスケープ文字。 \E \Q, \L, \U の処理を終了する。 \f 書式送り。 \g{}, \g1 名前付きの絶対または相対後方参照。 \G 位置表明。 \h 水平空白のための文字クラス。 \H 非水平空白のための文字クラス。 \k{}, \k<>, \k'' 名前付き後方参照。 \K Keep the stuff left of \K. \l 次の文字を小文字に。 \L \E まで小文字に。 \n (論理) 改行文字。 \N{} 名前付き (Unicode) 文字。 \p{}, \pP Unicode 特性付き文字。 \P{}, \PP Unicode 特性なし文字。 \Q \E までクォート。 \r 復帰文字。 \R 一般的な改行。 \s 空白のための文字クラス。 \S 非空白のための文字クラス。 \t タブ文字。 \u 辻の文字をタイトル文字に。 \U \E まで大文字に。 \v 垂直のための文字クラス。 \V 非垂直空白のための文字クラス。 \w 単語文字の文字クラス。 \W 非単語文字のための文字クラス。 \x{}, \x00 16 進数エスケープシーケンス。 \X 拡張 Unicode 「結合文字の並び」。 \z 文字列の末尾。 \Z 文字列の末尾。
一部の文字列は 文字エスケープ として動作します。 これらは、符号位置 (10 進と 16 進)、ASCII の名前、制御エスケープ(後述)、 短い説明と共に、以下の表に示しています。
Seq. 符号位置 ASCII Cntr 説明。 10 進 16 進 \a 7 07 BEL \cG アラームまたはベル \b 8 08 BS \cH 後退 [1] \e 27 1B ESC \c[ エスケープ文字 \f 12 0C FF \cL 書式送り \n 10 0A LF \cJ 改行 [2] \r 13 0D CR \cM 復帰 \t 9 09 TAB \cI タブ
\b
は文字クラスの中でのみ復帰文字です。
文字クラスの外側では、\b
は単語非単語境界です。
\n
は論理改行にマッチングします。
Perl はテキストファイルの読み書きをする時には \n
OS ネイティブな
改行文字との間を変換します。
$str =~ /\t/; # Matches if $str contains a (horizontal) tab.
\c
は制御文字を示すために使われます; \c
に引き続く文字は制御文字の
名前です。
例えば、/\cM/
は control-M (復帰、符号位置 13) にマッチングします。
\c
に引き続く文字の大文字小文字は無視されます: \cM
と \cm
は同じ
文字にマッチングします。
記憶法: 制御文字(control character)。
$str =~ /\cK/; # Matches if $str contains a vertical tab (control-K).
全ての Unicode 文字は Unicode 名を持ち、さまざまな用字の文字も同様に名前を
持ちます。
文字に独自の名前をつけることすら可能です。
\N{}
構文を使って名前による文字を使えます; 文字の名前は中かっこの間に
書きます。
文字の名前を読み込むには use charnames
とする必要があり、さもなければ
Perl は知らない名前を使うことについて警告します。
さらなる詳細については、charnames を参照してください。
記憶法: 名前付き文字(Named character)。
use charnames ':full'; # Loads the Unicode names. $str =~ /\N{THAI CHARACTER SO SO}/; # Matches the Thai SO SO character
use charnames 'Cyrillic'; # Loads Cyrillic names. $str =~ /\N{ZHE}\N{KA}/; # Match "ZHE" followed by "KA".
8 進数エスケープは逆スラッシュに引き続いて使い多い文字の符号位置に
マッチングする 2 または 3 文字の 8 進数からなります。
この方法で表現できる 512 文字 (\00
から \777
) が使えます。
Unicode 時代以前なら十分でしたが、ほとんどの Unicode 文字はこの方法では
エスケープできません。
8 進エスケープで表現される文字は正規表現エンジンにとって特別な意味を持たない 文字として考えられ、「そのまま」でマッチングすることに注意してください。
$str = "Perl"; $str =~ /\120/; # Match, "\120" is "P". $str =~ /\120+/; # Match, "\120" is "P", it is repeated at least once. $str =~ /P\053/; # No match, "\053" is "+" and taken literally.
8 進エスケープは潜在的に後方参照を破壊します。 これらはどちらも逆スラッシュに引き続く数値で構成されます。 それで Perl は後方参照か 8 進エスケープかを決定するのに発見的手法を 使います。 Perl は以下の規則を使います:
逆スラッシュに引き続くのが単一の数字なら、それは後方参照です。
逆スラッシュに引き続く文字が 0 なら、それは 8 進エスケープです。
逆スラッシュに引き続く数値が N (10 進) で、Perl がすでに N 個の 捕捉グループを見ているなら、Perl はこれを後方参照として扱います。 さもなければ、これは 8 進エスケープとして扱います。 N > 999 なら、Perl は 8 進エスケープとして最初の 3 桁のみを使うことに 注意してください; 残りはそのままマッチングされます。
my $pat = "(" x 999; $pat .= "a"; $pat .= ")" x 999; /^($pat)\1000$/; # Matches 'aa'; there are 1000 capture groups. /^$pat\1000$/; # Matches 'a@0'; there are 999 capture groups # and \1000 is seen as \100 (a '@') and a '0'.
16 進エスケープは \x
で始まり、2 桁の 16 進数あるいは中かっこで囲まれた
任意の桁の 16 進数が引き続きます。
16 進数は表現したい文字の符号位置です。
16 進エスケープで表現される文字は正規表現エンジンにとって特別な意味を持たない 文字として考えられ、「そのまま」でマッチングすることに注意してください。
記憶法: 16 進数(hexadecimal)。
$str = "Perl"; $str =~ /\x50/; # Match, "\x50" is "P". $str =~ /\x50+/; # Match, "\x50" is "P", it is repeated at least once. $str =~ /P\x2B/; # No match, "\x2B" is "+" and taken literally.
/\x{2603}\x{2602}/ # Snowman with an umbrella. # The Unicode character 2603 is a snowman, # the Unicode character 2602 is an umbrella. /\x{263B}/ # Black smiling face. /\x{263b}/ # Same, the hex digits A - F are case insensitive.
多くの逆スラッシュシーケンスは、引き続く文字を変更します。
\l
は引き続く文字を小文字に変えます; 一方\u
は引き続く文字を大文字(より
正確にはタイトル文字)にします
(これは関数 lcfirst
および ucfirst
と似たような機能を持ちます)。
複数の文字を大文字または小文字にするのに、\L
または \U
を
使いたいかもしれません; これは、パターンの末尾または次に
\E
が現れるまでの全ての文字を小文字/大文字にします。
これらは関数 lc
および uc
が行うのと同じような機能を持ちます。
\Q
は引き続く文字列を、次の \E
またはパターンの最後まで
エスケープします。
\Q
は英字、数字、下線でない全ての文字に逆スラッシュを追加します。
これにより \Q
と \E
の間の全ての文字はリテラルにマッチングし、正規表現
エンジンによって解釈されません。
記憶法: 小文字(Lowercase)、大文字(Uppercase)、クォート(Quotemeta)、 終了(End)。
$sid = "sid"; $greg = "GrEg"; $miranda = "(Miranda)"; $str =~ /\u$sid/; # Matches 'Sid' $str =~ /\L$greg/; # Matches 'greg' $str =~ /\Q$miranda\E/; # Matches '(Miranda)', as if the pattern # had been written as /\(Miranda\)/
Perl の正規表現は広い範囲の文字クラスを持っています。 文字クラスの一部は逆スラッシュシーケンスとして書かれます。 ここではそれらについて簡潔に議論します; 文字クラスに関する完全な詳細は perlrecharclass にあります。
\w
は任意の 単語 文字 (英字、数字、下線) にマッチングする
文字クラスです。
\d
数字にマッチングする文字クラスです; 一方文字クラス \s
は
空白文字にマッチングします。
perl 5.10.0 から導入されたのは、それぞれ水平空白文字と垂直空白文字に
マッチングする \h
と \v
です。
大文字の変種 (\W
, \D
, \S
, \H
, \V
) はそれぞれ単語文字、数字、
空白、水平空白、垂直空白ではない任意の文字にマッチングします。
記憶法: 単語(word)、数字(digit)、空白(space)、水平(horizontal)、 垂直(vertical)。
\pP
(ここで P
は単一の文字) と \p{Property}
は与えられた Unicode
特性にマッチングする文字にマッチングしていました; 特性には "letter" や
"thai character" のようなものが含まれます。
並びを \PP
と \P{Property}
のようにキャピタライズすると、与えられた
Unicode 特性にマッチングしない文字にマッチングするようになります。
さらなる詳細については、perlrecharclass/Backslashed sequences と
Unicode Character Properties in perlunicode を参照してください。
記憶法: 特性(property)。
正規表現で捕捉かっこが使われると、マッチングしたソース文字列の一部を 参照したり、全く同じものにマッチングしたりできます。 このような 後方参照 を参照するには三つの方法があります: 絶対、相対、 名前付きです。
逆スラッシュで始まり、数値が引き続く逆スラッシュシーケンスは絶対参照です
(しかし上述した注意を参照してください)。
数値が N なら、これは N 番目のかっこの組を参照します - 同様にこのかっこの
組でマッチングしたものは \N
でマッチングしたものである必要があります。
/(\w+) \1/; # Finds a duplicated word, (e.g. "cat cat"). /(.)(.)\2\1/; # Match a four letter palindrome (e.g. "ABBA").
perl 5.10.0 からの新機能は捕捉バッファを参照する異なった方法です:
\g
です。
\g
は引数として数値を取ります; 数値は中かっこでかこまれます(中かっこは
オプションです)。
数値 (N) に符号がなければ、これは N 番目の捕捉グループです (従って
\g{2}
は \2
と等価です - 但し \g
は常に捕捉グループへの参照であり、
8 進エスケープになることはありません)。
数値が負数なら、参照は相対で、\g{-N}
の N 個前のグループを参照します。
\g{-N}
の大きな利点は、捕捉グループを含んでいるような大きなパターンに
展開されるような参照のパターンをより簡単に書けることです。
記憶法: グループ(group)。
/(A) # Buffer 1 ( # Buffer 2 (B) # Buffer 3 \g{-1} # Refers to buffer 3 (B) \g{-3} # Refers to buffer 1 (A) ) /x; # Matches "ABBA".
my $qr = qr /(.)(.)\g{-2}\g{-1}/; # Matches 'abab', 'cdcd', etc. /$qr$qr/ # Matches 'ababcdcd'.
もう一つの perl 5.10.0 からの新機能は、名前で参照できる名前付き捕捉バッファの
使用です。
これは \g{name}
として行われます; これは name という名前の
捕捉バッファへの後方参照です。
.Net 正規表現との互換性のために、\g{name}
は \k{name}
, \k<name>
,
\k'name'
とも書けます。
\g{}
は潜在的には曖昧であることに注意してください; 名前付き
参照かもしれませんし、(引数が数値なら)絶対または相対参照かもしれません。
しかし、名前は数字で始めたり、ハイフンを含めたりすることはできないので、
ここに曖昧さはありません。
/(?<word>\w+) \g{word}/ # Finds duplicated word, (e.g. "cat cat") /(?<word>\w+) \k{word}/ # Same. /(?<word>\w+) \k<word>/ # Same. /(?<letter1>.)(?<letter2>.)\g{letter2}\g{letter1}/ # Match a four letter palindrome (e.g. "ABBA")
表明は真である必要がある条件です -- 実際に部分文字列の一部に マッチングすることはありません。 逆スラッシュシーケンスとして書かれる六つの表明があります。
\A
は文字列の先頭にのみマッチングします。
/m
修飾子が使われていなければ、/\A/
は /^/
と等価です。
しかし、/m
修飾子が使われると、/^/
は内部改行にマッチングしますが、
/\A/
の意味は /m
修飾子によって変わりません。
\A
は、/m
修飾子が使われるかどうかに関わらず文字列の先頭に
マッチングします。
\z
と \Z
は文字列の末尾にマッチングします。
/m
修飾子が使われていなければ、/\Z/
は /$/
と等価で、文字列の
末尾か、文字列の末尾の改行の手前にマッチングします。
/m
修飾子が使われると、/$/
は内部改行にマッチングしますが、
/\Z/
の意味は /m
修飾子によって変わりません。
\Z
は、/m
修飾子が使われるかどうかに関わらず文字列の末尾(あるいは
末尾の改行の直前)にマッチングします。
\z
は \Z
と同様ですが、末尾の改行の手前ではマッチングしません。
\z
は文字列の末尾にのみマッチングします - 修飾子が使われるかや改行の
前かに関わりません。
\G
は普通は /g
修飾子との組み合わせでのみ使われます。
/g
修飾子が使われると(そしてマッチングがスカラ根的宇土で行われると)、
Perl は最後のマッチングが終了したソース文字列の位置を覚えていて、次回の
マッチングでは、前回終わった位置からマッチングを開始します。
\G
は前回のマッチングが終了した位置、あるいは前回にマッチングがなければ
文字列の先頭にマッチングします。
記憶法: グローバル(Global)。
\b
は単語文字と非単語文字の境界にマッチングします; \B
は \b
が
マッチングしない任意の文字間にマッチングします。
\b
と \B
は、ソース文字列の先頭の前と末尾の後ろに非単語文字があると
仮定します; 従って \b
は、ソース文字列が単語文字で始まっている(または
終わっている)場合はソース文字列の先頭(または末尾)にマッチングします。
さもなければ、\B
がマッチングします。
記憶法: 境界(boundary)。
"cat" =~ /\Acat/; # Match. "cat" =~ /cat\Z/; # Match. "cat\n" =~ /cat\Z/; # Match. "cat\n" =~ /cat\z/; # No match.
"cat" =~ /\bcat\b/; # Matches. "cats" =~ /\bcat\b/; # No match. "cat" =~ /\bcat\B/; # No match. "cats" =~ /\bcat\B/; # Match.
while ("cat dog" =~ /(\w+)/g) { print $1; # Prints 'catdog' } while ("cat dog" =~ /\G(\w+)/g) { print $1; # Prints 'cat' }
ここでは上述のカテゴリの一つに当てはまらない逆スラッシュシーケンスについて 記述します。 それは:
\C
は、例えソース文字列が UTF-8 形式でエンコードされていても、
常に単一のオクテットにマッチングし、マッチングする文字は複数オクテット
文字です。
\C
は perl 5.6 で導入されました。
記憶法: オクテット(oCtet)。
これは perl 5.10.0 からの新しいものです。
\K
の左側でマッチングしたものは $&
に含まれません - そして
パターンが置換で使われた場合は置き換えられません。
これにより、s/(PAT1) PAT2/${1}REPL/x
or s/(?<=PAT1) PAT2/REPL/x
の
代わりに s/PAT1 \K PAT2/REPL/x
と書けます。
Mnemonic: 保持(Keep)。
\R
は 一般的な改行 にマッチングします; これは Unicode で改行として
扱われるものです。
これには \v
(垂直空白) でマッチングする全ての文字、複数文字並び
"\x0D\x0A"
(復帰に引き続いて改行、またの名をネットワーク改行、
または Windows テキストファイルで使われる改行) を含みます。
\R
は (?>\x0D\x0A)|\v)
と等価です。
\R
は複数の文字にマッチングするので、大かっこ文字クラスの内側には
使えません; /[\R]/
はエラーです。
\R
は perl 5.10.0 で導入されました。
記憶法: 実際のところありません。
\R
が選ばれたのは、PCRE が既に \R
を使っていて、さらに重要なのは
Unicode がこのような正規表現メタ文字を勧めていて、記法として \R
を
提案しているからです。
これは拡張された Unicode の 結合文字の並び にマッチングし、
(?>\PM\pM*)
と等価です。
\PM
は Unicode マーク文字ではない任意の文字にマッチングし、一方
\pM
は Unicode マーク文字にマッチングします; それで \X
は
任意の非マーク文字に 0 個以上のマーク文字にマッチングします。
マーク文字には 結合文字の並び と 母音マーク を含みます (しかし
これだけではありません)。
\X
は普通の (非 Unicode プログラマの) 使い方で単一の文字と考えられるものに
かなりうまくマッチングします: 例えば基底文字 (上述の \PM
)、例えば文字、
引き続いて 0 以上のダイアクリティカルマーク、つまり 結合文字 (上述の
\pM*
) です。
記憶法: 拡張 Unicode 文字(eXtended Unicode character)。
"\x{256}" =~ /^\C\C$/; # Match as chr (256) takes 2 octets in UTF-8.
$str =~ s/foo\Kbar/baz/g; # Change any 'bar' following a 'foo' to 'baz'. $str =~ s/(.)\K\1//g; # Delete duplicated characters.
"\n" =~ /^\R$/; # Match, \n is a generic newline. "\r" =~ /^\R$/; # Match, \r is a generic newline. "\r\n" =~ /^\R$/; # Match, \r\n is a generic newline.
"P\x{0307}" =~ /^\X$/ # \X matches a P with a dot above.