バックスラッシュ〔日本語環境では円記号となる場合もある〕には、 いくつかの使用法があります。ひとつめの使用法は、 非英数字の前に記述する場合で、続く文字が表す特別な意味を取り去ります。 このエスケープ文字としての使用法は、 文字クラスの内外部いずれでも可能です。
たとえば、"*" 文字とマッチさせたい場合は、パターンを "\*" と記述します。 続く文字がメタ文字として解釈されるものであるかには関係ありませんので、 いかなる非英数字に対しても、"\" を付けると、その文字自体が 表わされることになります。特に、 バックスラッシュとマッチさせたい場合は、"\\" と記述します。
注意:
シングルクォートあるいはダブルクォートで囲まれた PHP の 文字列 の中では、バックスラッシュは特別な意味を表します。 そのため、正規表現 \\ を使用して \ とマッチさせたい場合は PHP のコード内では "\\\\" あるいは '\\\\' と記述する必要があります。
パターンを、 PCRE_EXTENDED オプションを付けてコンパイルすると、(文字クラス内部を除き) パターン中の空白文字、および "#" とその次の改行文字との間の文字は 無視されます。空白文字や "#" をパターン中に含めるには、 バックスラッシュを用いてエスケープします。
バックスラッシュの 2 番目の使用法は、非表示文字〔制御コードなど〕を パターン中に目に見える形で記述するための方法です。ヌル文字は パターンを終了させてしまうため使えませんが、その他の非表示文字は、 パターンにそのまま含めても問題はありません。しかし、パターンの編集には、 バイナリ文字をそのまま用いるよりも、以下に示すエスケープシーケンスを 用いる方が便利でしょう。
"\cx" の正確な働きは、次の通りです。"x" が小文字の場合、 大文字に変換されます。続いて、文字の 6 ビット目 (16進数 40) が 反転されます。つまり、"z" は 16 進数の 1A になり、"{" は 3B になり、 ";" は 7B になります。
"\x" の後では、2 桁までの 16 進数が読まれます (大小文字どちらも可能です)。 "\0" の後では、さらに 2 桁の 8 進数が 読みこまれます。いずれの場合も、2 桁より少ない場合、桁があるだけ 読みこまれます。つまり、"\0\x\07" は ヌル文字 2 つの後にベル文字が 続いたものを表します。8 進数を指定する場合は、必ず最初のゼロに続いて 残りの 2 桁の数字を指定するように注意してください。
バックスラッシュの後に 0 以外の数字が続く場合の処理は複雑です。 文字クラスの外部では、 PCRE は、続く数字全体を 10 進数として読みます。 数字が 10 よりも小さい場合、または、正規表現の中に含まれる キャプチャ用左カッコの数以下の場合、 後方参照 として解釈されます。 この動作に関する詳しい説明は、後ほど、カッコによるサブパターンの説明を 行ってから示します
文字クラスの中、または、指定された 10 進数が 9 より大きく、 キャプチャ用サブパターンの数がこの数に満たない場合は、PCRE は バックスラッシュの後から最大 3 文字の 8 進数を再度読みこみ、 その値の最下位 8 ビットから 1 バイトを生成します。 その後に続く数字は、それ自体を表します。以下に例を示します。
3 桁を超えて 8 進数は読みこまれないため、100 以上の 8 進数には ゼロを前につけてはいけないことに注意してください。
これらの 1 バイト値を定義するエスケープシーケンスは、
文字クラスの内外部のいずれでも使用できます。加えて、文字クラス内では
エスケープシーケンス "\b
" はバックスペース (16進 0x) として解釈されます。
文字クラス外では、別の意味を有します(別記参照)。
バックスラッシュの第 3 の使用法は、包括的な文字型を指定する用途です。
これらエスケープシーケンスの各組により、文字集合が 2 つに分割されます。 文字は、各組のどちらか片方だけにマッチします。
空白文字とは HT (9)、LF (10)、FF (12)、CR (13)、スペース (32) のことです。 しかし、ロケールを指定したマッチングを行った場合には、128から255までのコードポイントの文字 (たとえば NBSP (A0)) も空白文字とみなされる可能性があります。
単語構成文字とは、英字または数字またはアンダースコア文字であり、Perl
が定義するところの「単語」と成り得る文字のことです。文字および数字の
定義は、PCRE の文字テーブルにより制御され、ロケールを指定して
マッチングを行うと変わる可能性があります。
例えば、"fr" (フランス語)ロケールの場合、128 を超える
文字コードのいくつかは、アクセント付きの文字に使われており、
これらは \w
とマッチします。
これらの文字型表記は、文字クラスの内外によらず使用可能で、 対応する型のたかだか 1 文字とマッチします。カレントのマッチング位置が 検索対象文字列の終端である場合、マッチできる文字が無いので、 マッチは失敗します。
バックスラッシュの第 4 の使用法は、簡単な言明 (assertion) です。 言明とは、マッチがある特定の位置でだけ可能だという条件を指定するもので、 検索対象文字列から文字を消費 (consume)〔つまり文字自体にマッチ〕 しません。サブパターンを使ったより複雑な言明の方法もありますが、 それについての解説は後ほど行います。バックスラッシュを使った言明は、 次のものがあります
これらの言明は、文字クラス内では使用できません(また、文字クラス内では、
"\b
" はバックスペース文字という別の意味を持つので
注意してください)。
単語境界 (word boundary) とは、検索対象文字列において、
カレントの文字およびその前の文字が同時に \w
もしくは \W
にマッチしない(すなわち、片方が
\w
にマッチし、もう片方が \W
にマッチする)位置、もしくは、文字列の始めか終わりで、
その始めか終わりの文字が \w
にマッチする位置の
ことです。
言明 \A
, \Z
,
\z
は、(アンカー で説明する)ハット記号やドル記号とは
異なり、オプション設定によらず、文字列の始端または終端だけに
マッチします。これらの言明は、PCRE_MULTILINE および PCRE_DOLLAR_ENDONLY
オプションの影響を受けません。
\Z
と \z
との違いは、
\Z
は文字列の末尾の改行の前の位置および文字列の
終端にマッチするのに対し、\z
は文字列の終端にのみ
マッチすることです。
言明 \G
は、カレントのマッチング位置が、
preg_match() 関数の offset
引数に指定されたマッチングの開始位置である場合に真になります。
offset
が非ゼロの場合は、\A
と等価ではありません。
\Q
と \E
とを使って、
パターン中のメタ文字を無視させることができます。
たとえば、
\w+\Q.$.\E$は、文字列の終端において1つ以上の単語構成文字のあとに
.$.
というリテラルが続いたものにマッチします。
これらは、デリミタの動作を変更しないことに注意して下さい。
たとえば、#\Q#\E#$
は無効なパターンです。
なぜなら、#
がパターンの終端としてマークされ、
\E#
が無効な修正子と解釈されるからです。
\K
を使用すると、マッチの開始位置をリセットできます。
たとえば、パターン
foo\Kbar
は "foobar" にマッチしますが、
結果は "bar" にマッチしたと報告されます。
\K
を使用しても、キャプチャした部分文字列には影響を及ぼしません。
たとえば、パターン (foo)\Kbar
が
"foobar" にマッチしたときの最初の部分文字列は "foo" です。