正規表現ではどの特殊文字をエスケープする必要がありますか? 質問する

正規表現ではどの特殊文字をエスケープする必要がありますか? 質問する

()[]{}|正規表現の多くの実装を使用するときに、' ' などの特殊文字をエスケープする必要があるかどうかを常に推測しようとすることにうんざりしています。

たとえば、Python、sed、grep、awk、Perl、rename、Apache、find などでは異なります。特殊文字をエスケープするべきかどうかを示すルール セットはありますか? PCRE、POSIX、拡張正規表現などの正規表現の種類によって異なりますか?

ベストアンサー1

どの文字をエスケープする必要があり、どの文字をエスケープしてはならないかは、使用している正規表現の種類によって異なります。

PCRE および他のほとんどのいわゆる Perl 互換フレーバーでは、次の外側の文字クラスをエスケープします。

.^$*+?()[{\|

そして文字クラス内には以下があります:

^-]\

POSIX 拡張正規表現 (ERE) の場合、次の文字クラスの外側をエスケープします (PCRE と同じ)。

.^$*+?()[{\|

その他の文字をエスケープすると、POSIX ERE ではエラーになります。

文字クラス内では、バックスラッシュは POSIX 正規表現のリテラル文字です。何かをエスケープするために使用することはできません。文字クラスのメタ文字をリテラルとして含める場合は、「巧みな配置」を使用する必要があります。文字クラスの先頭以外の任意の場所に ^ を配置し、先頭に ] を配置し、文字クラスの先頭または末尾に - を配置して、これらをリテラルに一致させます。例:

[]^-]

POSIX 基本正規表現 (BRE) では、意味を抑制するためにエスケープする必要があるメタ文字は次のとおりです。

.^$*[\

BRE で括弧と中括弧をエスケープすると、ERE でのエスケープされていないバージョンと同じ特別な意味が与えられます。一部の実装 (GNU など) では、\? や + など、エスケープされた他の文字にも特別な意味が与えられます。.^$*(){} 以外の文字をエスケープすると、通常、BRE ではエラーになります。

文字クラス内では、BRE は ERE と同じルールに従います。

これらすべてが頭を混乱させるなら、正規表現バディ作成タブで、トークンの挿入をクリックし、リテラルをクリックします。RegexBuddy は必要に応じてエスケープを追加します。

おすすめ記事