web-dev-qa-db-ja.com

RegExに入力する前にエスケープする必要があるすべての文字のリスト?

誰かがエスケープすべき特殊文字の完全なリストを教えてもらえますか?

私はそれらのいくつかを知らないのではないかと心配しています。

65
Somebody

PHPの_preg_quote_関数のPHP.JSの実装を見てください。必要なことを実行できます。

http://phpjs.org/functions/preg_quote:491

特殊な正規表現文字は次のとおりです。. \ + * ? [ ^ ] $ ( ) { } = ! < > | : -

67
Tatu Ulmanen

このサイト によると、エスケープする文字のリストは

[、バックスラッシュ\、キャレット^、ドル記号$、ピリオドまたはドット。、垂直バーまたはパイプ記号|、疑問符?、アスタリスクまたは星*、プラス記号+、開き丸括弧(および閉じ丸括弧)。

それに加えて、Javascriptインタープリターによって文字列の終わりとして解釈される文字をエスケープする必要があります。つまり、'または"

9
Andrea

Tatu Ulmanenの答えに基づいて、C#での私のソリューションは次の形式を取りました。

private static List<string> RegexSpecialCharacters = new List<string>
{
    "\\",
    ".",
    "+",
    "*",
    "?",
    "[",
    "^",
    "]",
    "$",
    "(",
    ")",
    "{",
    "}",
    "=",
    "!",
    "<",
    ">",
    "|",
    ":",
    "-"
};


foreach (var rgxSpecialChar in RegexSpecialCharacters)
                rgxPattern = input.Replace(rgxSpecialChar, "\\" + rgxSpecialChar);

「\」と「。」の位置を入れ替えたことに注意してください。最初にスラッシュを処理しないと、「\」が2倍になります。

4
hngr18

ハイフン(-)は、角かっこ内にあり、開始または終了に配置されていない場合、エスケープする必要があります。エスケープする必要がある-のために

[a-z0-9\-_]+

エスケープする必要はありません-のために

[a-z0-9_-]+
4
jj2005

問題:

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, '\\$&')
}
0
haravares

私は、reg-exのESLintの「no-useless-escape」設定に関してこのリストを探していました。また、これらの文字の一部は、JSの正規表現ではエスケープする必要がないことがわかりました。ここの他の回答の長いリストは、追加の文字をエスケープする必要があるPHP用です。

ESLintのこのgithubの問題 では、中途半端に、ユーザーnot-an-aardvarkが、問題で参照されている文字がエスケープされる可能性のある文字である理由を説明します。

Javascriptでは、エスケープする必要がある文字は 構文文字 、または次のいずれかです。

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

上記にリンクしたgithubの問題への応答には、「Annex B」セマンティクス(これについてはあまり知りません)に関する説明が含まれています。これにより、上記の文字のうち4つをエスケープできます:) ] { }

もう1つ注意すべきことは、エスケープを必要としないキャラクターをエスケープしても害はありません(エスケープキャラクターをエスケープしようとしている場合を除く)。だから、私の個人的な経験則は:「疑わしいときは逃げる」

0
Michael S