1. ホーム
  2. regex

[解決済み] 正規表現でエスケープしなければならない特殊文字は何ですか?

2022-03-22 18:51:32

質問

のような特殊文字をエスケープすべきかどうか、いつも試行錯誤で疲れてしまいます。 ()[]{}| 正規表現の多くの実装を使用する場合、'など。

例えば、Python, sed, grep, awk, Perl, rename, Apache, find などでは違います。 特殊文字をいつエスケープして、いつエスケープしないかというルールセットはあるのでしょうか?PCRE、POSIX、拡張正規表現など、正規表現の種類に依存するのでしょうか?

どのように解決するのですか?

どの文字をエスケープして、どの文字をエスケープしないかは、使用する正規表現に依存します。

PCRE、および他のほとんどのいわゆるPerl互換フレーバーでは、これらの外部文字クラスをエスケープしてください。

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

と、これらは文字クラスの内部です。

^-]\

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

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

それ以外の文字をエスケープするとPOSIX EREでエラーになります。

文字クラスの内部では、バックスラッシュはPOSIX正規表現におけるリテラル文字です。 これを使用して何かをエスケープすることはできません。 文字クラスのメタキャラクタをリテラルとして含めたい場合は、"賢い配置"を使用する必要があります。 文字クラスの先頭以外の場所に^を、先頭に[]を、そして先頭または末尾に-を置くと、これらに文字通りマッチします(例)。

[]^-]

POSIX基本正規表現(BRE)では、メタキャラクタであり、エスケープすることで意味を抑制する必要があります。

.^$*[\

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

文字クラスの内部では、BRE は ERE と同じ規則に従います。

もし、これだけで頭が混乱するようなら、次の本を手に取ってみてください。 RegexBuddy . 作成]タブで[トークンの挿入]、[リテラル]の順にクリックします。 RegexBuddy は必要に応じてエスケープを追加します。