誰かがエスケープすべき特殊文字の完全なリストを教えてもらえますか?
私はそれらのいくつかを知らないのではないかと心配しています。
PHPの_preg_quote
_関数のPHP.JSの実装を見てください。必要なことを実行できます。
特殊な正規表現文字は次のとおりです。. \ + * ? [ ^ ] $ ( ) { } = ! < > | : -
このサイト によると、エスケープする文字のリストは
[、バックスラッシュ\、キャレット^、ドル記号$、ピリオドまたはドット。、垂直バーまたはパイプ記号|、疑問符?、アスタリスクまたは星*、プラス記号+、開き丸括弧(および閉じ丸括弧)。
それに加えて、Javascriptインタープリターによって文字列の終わりとして解釈される文字をエスケープする必要があります。つまり、'
または"
。
Tatu Ulmanenの答えに基づいて、C#での私のソリューションは次の形式を取りました。
private static List<string> RegexSpecialCharacters = new List<string>
{
"\\",
".",
"+",
"*",
"?",
"[",
"^",
"]",
"$",
"(",
")",
"{",
"}",
"=",
"!",
"<",
">",
"|",
":",
"-"
};
foreach (var rgxSpecialChar in RegexSpecialCharacters)
rgxPattern = input.Replace(rgxSpecialChar, "\\" + rgxSpecialChar);
「\」と「。」の位置を入れ替えたことに注意してください。最初にスラッシュを処理しないと、「\」が2倍になります。
ハイフン(-)は、角かっこ内にあり、開始または終了に配置されていない場合、エスケープする必要があります。エスケープする必要がある-のために
[a-z0-9\-_]+
エスケープする必要はありません-のために
[a-z0-9_-]+
問題:
const character = '+'
new RegExp(character, 'gi') // error
スマートソリューション:
// with babel-polyfill
// Warning: will be removed from babel-polyfill v7
const character = '+'
const escapeCharacter = RegExp.escape(character)
new RegExp(escapeCharacter, 'gi') // /\+/gi
// ES5
const character = '+'
const escapeCharacter = escapeRegExp(character)
new RegExp(escapeCharacter, 'gi') // /\+/gi
function escapeRegExp(string){
return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
}
私は、reg-exのESLintの「no-useless-escape」設定に関してこのリストを探していました。また、これらの文字の一部は、JSの正規表現ではエスケープする必要がないことがわかりました。ここの他の回答の長いリストは、追加の文字をエスケープする必要があるPHP用です。
ESLintのこのgithubの問題 では、中途半端に、ユーザーnot-an-aardvark
が、問題で参照されている文字がエスケープされる可能性のある文字である理由を説明します。
Javascriptでは、エスケープする必要がある文字は 構文文字 、または次のいずれかです。
^ $ \ . * + ? ( ) [ ] { } |
上記にリンクしたgithubの問題への応答には、「Annex B」セマンティクス(これについてはあまり知りません)に関する説明が含まれています。これにより、上記の文字のうち4つをエスケープできます:) ] { }
。
もう1つ注意すべきことは、エスケープを必要としないキャラクターをエスケープしても害はありません(エスケープキャラクターをエスケープしようとしている場合を除く)。だから、私の個人的な経験則は:「疑わしいときは逃げる」