Regular Expressions
エスケープ
サーチ…
生の文字列リテラル
可読性(そしてあなたの正気)がエスケープを避けるために最善です。これは、生の文字列リテラルが入る場所です(文字列よりも優先される区切り文字を使用できる言語もありますが、それは別のセクションです)。
[A]バックスラッシュ
\
、単に "バックスラッシュ"を意味すると解釈されます(リテラルを終了させる引用符の直前の場合を除く)。改行、タブ、バックスペース、フォームフィードを表す "エスケープシーケンス"はありません。 、 等々。
すべての言語がそれらを持っているわけではなく、さまざまな構文を使用する言語もあります。 C#は実際にはそれらを逐語的な文字列リテラルと呼びますが、それは同じことです。
Python
pattern = r"regex"
pattern = r'regex'
C ++(11+)
ここでの構文は非常に多用途です。唯一の規則は正規表現のどこにも現れない区切り文字を使うことです。それを行うと、文字列の中に何も追加エスケープする必要はありません。括弧()
は正規表現の一部ではないことに注意してください。
pattern = R"delimiter(regex)delimiter";
VB.NET
ただ普通の文字列を使用してください。バックスラッシュは常にリテラルです。
C#
pattern = @"regex";
この構文では、 ""
(2つの二重引用符)をエスケープ形式の"
。
文字列
ほとんどのプログラミング言語では、文字列リテラルから生成された文字列にバックスラッシュを入れるには、文字列リテラルで各バックスラッシュを2倍にする必要があります。それ以外の場合は、次の文字のエスケープとして解釈されます。
残念なことに、正規表現に必要なバックスラッシュは、リテラルのバックスラッシュでなければなりません。これは、正規表現が文字列リテラルから生成されるときに "エスケープエスケープ"( \\
)を持つ必要がある理由です。
さらに、文字列リテラルの引用符( "
または'
)をエスケープする必要があるかもしれませんが、文字列リテラルの囲みに応じて、引用符のスタイルを使用することも可能です。文字列リテラル全体をエスケープする)。
いくつかの言語(例えば、Java <= 7)では、正規表現を/\w/
ようなリテラルとして直接表現することはできません。それらは文字列から生成されなければならず、通常は文字列リテラルが使用されます(この場合は"\\w"
。このような場合は、引用符、バックスラッシュなどのリテラル文字をエスケープする必要があります。これを達成する最も簡単な方法は、 RegexPlanetのようなツールを使用することです。この特定のツールはJava用に設計されていますが、同様の文字列構文を持つすべての言語で機能します。
どのキャラクターをエスケープする必要がありますか?
文字エスケープとは、入力文字列内で特定の文字(検索を操作するための正規表現エンジンによって予約されている)を文字通り検索して見つけることを可能にするものです。エスケープはコンテキストに依存するため、この例では、エスケープ文字列またはデリミタは対象としません。
バックスラッシュ
バックスラッシュが「エスケープ」文字であると言うのは、少し誤解を招くことです。バックスラッシュのエスケープとバックスラッシュがもたらします。それは実際にメタキャラクターの前と後ろの文字の状態を切り替えるかどうかを切り替えます。
正規表現内の任意の場所にリテラル・バックスラッシュを使用するには、別のバックスラッシュでエスケープする必要があります。
エスケープ(文字クラス外)
文字通り(少なくともcharクラスの外で)取られるためにはエスケープする必要のあるいくつかの文字があります:
- 角かっこ:
[]
- かっこ:(
()
- 中括弧:
{}
- 演算子:
*
、+
?
、|
- アンカー:
^
、$
- その他:
.
、\
- 正規表現の最後にリテラル
^
またはリテラル$
を使用するには、その文字をエスケープする必要があります。 - いくつかのフレーバは、それぞれ正規表現の先頭または末尾にあるときに
^
と$
をメタ文字として使用します。これらのフレーバーでは、さらにエスケープする必要はありません。とにかくそれらをエスケープするのが通常ちょうどよいです。
文字クラス内でのエスケープ
- 角カッコ(
[
および]
)がcharクラスのリテラルとして表示されている場合は、それらをエスケープすることをお勧めします。特定の条件の下では、味に応じて必須ではありませんが、読みやすさに害を与えます。 - キャレットクラス
[^aeiou]
の最初の文字としてキャレット^
メタ文字にすると、[^aeiou]
ます。 charクラスの他の場所では、それは単なるリテラル文字です。 - ダッシュ(
-
)は、文字クラスの先頭または末尾にない限り、メタ文字です。 charクラスの最初の文字がキャレット^
場合、charクラスの2番目の文字であればリテラルになります。
交換をエスケープする
交換の中でエスケープする規則もありますが、上記の規則は適用されません。唯一のメタキャラクタは$
と\
。少なくとも、キャプチャグループを参照するために$
を使用することができます(グループ1の場合は$1
ようになります)。リテラル$
を使用するに$
、 \$5.00
エスケープします。同様に\
: C:\\Program Files\\
。
BRE例外
ERE(拡張正規表現)は典型的なPerlスタイルの構文を反映していますが、BRE(基本正規表現)ではエスケープに大きな違いがあります。
- 異なる略式の構文があります。
\d
、\s
、\w
などはすべて消えています。代わりに、それは[:digit:]
ような独自の構文(POSIXが混乱して "文字クラス"を呼ぶ)を持っています。これらの構文は文字クラス内になければなりません。 - 通常使用できるメタキャラクタ(
.
、*
、^
、$
)はほとんどありません。他のすべてのメタキャラクタを別々にエスケープする必要があります。
ブレース{}
-
a{1,2}
一致a{1,2}
ます。いずれかと一致するようにa
またはaa
、使用a\{1,2\}
括弧()
-
(ab)\1
は無効です。キャプチャグループ1が存在しないため、無効です。修正するにはabab
と一致させるには\(ab\)\1
バックスラッシュ
- charクラス(POSIXのブラケット式と呼ばれます)では、バックスラッシュはメタキャラクタではなく(エスケープする必要はありません)。
[\d]
は\
またはd
一致します。 - 他の場所では、いつものようにエスケープしてください。
その他
-
+
と?
リテラルです。 BREエンジンがそれらをメタキャラクタとしてサポートしている場合は、\?
エスケープする必要があります\?
と\+
。
/デリミタ/
多くの言語で正規表現を2つの特定の文字(通常はスラッシュ/
間に囲むか区切ることができます。
区切り文字はエスケープに影響します。区切り文字が/
で、正規表現が/
リテラルを探す必要がある場合は、リテラル( \/
)にする前にスラッシュをエスケープする必要があります。
過度のエスケープは可読性に悪影響を及ぼすため、使用可能なオプションを検討することが重要です。
Javascriptは、スラッシュを区切り文字として使用できるのでユニークですが、 文字列化された正規表現は許可されますが、それ以外のものはありません。
PCREでは、マッチした区切り文字とブラケットスタイルの区切り文字の2種類の区切り文字を使用できます 。マッチされたデリミタは、1つのキャラクタのペアを使用し、ブラケットスタイルのデリミタは、オープニングとクロージングのペアを表す2つの文字を使用します。
- 一致するデリミタ:
!"#$%&'*+,./:;=?@^_`|~-
- ブラケットスタイルのデリミタ:
()
、{}
、[]
、<>