Liste de tous les caractères qui devraient être échappés avant d'être mis dans RegEx?
Quelqu'un pourrait-il donner une liste complète des caractères spéciaux qui devraient être échappés?
J'ai peur de ne pas en connaître certains.
6 réponses
Jetez un oeil à PHP.L'implémentation de JS de la fonction preg_quote
de PHP, qui devrait faire ce dont vous avez besoin:
Les caractères spéciaux de l'expression régulière sont: . \ + * ? [ ^ ] $ ( ) { } = ! < > | : -
Selon ce site, la liste des caractères à échapper à
[, la barre oblique inverse \, le caret^, le signe dollar$, le point ou la période ., la barre verticale ou le symbole de tuyau|, le point d'interrogation ?, l'astérisque ou l'étoile*, le signe plus+, le support rond d'ouverture ( et le support rond de fermeture).
En plus de cela, vous devez échapper les caractères qui sont interprétés par L'interpréteur Javascript comme fin de la chaîne, c'est-à-dire '
ou "
.
Le Trait d'Union ( - ) doit être échappé lorsqu'il est entre crochets et qu'il n'est pas positionné au début ou à la fin par exemple Besoin d'échapper-pour
[a-z0-9\-_]+
Pas besoin de s'échapper - pour
[a-z0-9_-]+
Basé sur la réponse de Tatu Ulmanen, ma solution en C # a pris cette forme:
private static List<string> RegexSpecialCharacters = new List<string>
{
"\\",
".",
"+",
"*",
"?",
"[",
"^",
"]",
"$",
"(",
")",
"{",
"}",
"=",
"!",
"<",
">",
"|",
":",
"-"
};
foreach (var rgxSpecialChar in RegexSpecialCharacters)
rgxPattern = input.Replace(rgxSpecialChar, "\\" + rgxSpecialChar);
Notez que j'ai changé les positions de ' \ ' et '.', l'échec à traiter les barres obliques première conduira à doubler de la " de
Je cherchais cette liste en ce qui concerne le paramètre "no-useless-escape" d'ESLint pour reg-ex. Et trouvé certains de ces caractères mentionnés n'ont pas besoin d'être échappés pour une expression régulière dans JS. La liste la plus longue dans l'autre réponse ici est pour PHP, ce qui nécessite que les caractères supplémentaires soient échappés.
Dans ce problème github pour ESLint, à mi-chemin, user not-an-aardvark
explique pourquoi le caractère référencé dans le problème est un caractère qui devrait peut-être être échapper.
En javascript, un caractère qui doit être échappé est un caractère de syntaxe , ou l'un de ceux-ci:
^ $ \ . * + ? ( ) [ ] { } |
La réponse au problème github auquel j'ai lié ci-dessus inclut une explication de la sémantique "Annexe B" (Que Je ne connais pas beaucoup) qui permet à 4 des caractères mentionnés ci-dessus d'être échappés: ) ] { }
.
Une autre chose à noter est que l'échappement d'un personnage qui ne nécessite pas d'échapper ne fera aucun mal (sauf peut-être si vous essayez de échapper le caractère d'échappement). Donc, ma règle de base personnelle est: "en cas de doute, échapper"
Le problème:
const character = '+'
new RegExp(character, 'gi') // error
Solutions intelligentes:
// ES2016
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, '\\$&')
}