La plupart des expressions ici résolvent des cas d'utilisation spécifiques uniques.
Ce n'est pas grave, mais je préfère une approche "toujours efficace".
function regExpEscape(literal_string) {
return literal_string.replace(/[-[\]{}()*+!<=:?.\/\\^$|#\s,]/g, '\\$&');
}
Cela "échappera complètement" à une chaîne littérale pour l'une des utilisations suivantes dans les expressions régulières:
- Insertion dans une expression régulière. Par exemple
new RegExp(regExpEscape(str))
- Insertion dans une classe de caractères. Par exemple
new RegExp('[' + regExpEscape(str) + ']')
- Insertion dans le spécificateur de nombre entier. Par exemple
new RegExp('x{1,' + regExpEscape(str) + '}')
- Exécution dans des moteurs d'expression régulière non JavaScript.
Caractères spéciaux couverts:
-
: Crée une plage de caractères dans une classe de caractères.
[
/ ]
: Démarre / termine une classe de caractères.
{
/ }
: Démarre / termine un spécificateur de numérotation.
(
/ )
: Démarre / termine un groupe.
*
/ +
/ ?
: Spécifie le type de répétition.
.
: Correspond à n'importe quel caractère.
\
: Échappe les caractères et démarre les entités.
^
: Spécifie le début de la zone de correspondance et annule la correspondance dans une classe de caractères.
$
: Spécifie la fin de la zone correspondante.
|
: Spécifie l'alternance.
#
: Spécifie le commentaire en mode d'espacement libre.
\s
: Ignoré en mode d'espacement libre.
,
: Sépare les valeurs dans le spécificateur de numération.
/
: Démarre ou termine l'expression.
:
: Complète les types de groupes spéciaux et fait partie des classes de caractères de style Perl.
!
: Annule le groupe de largeur nulle.
<
/ =
: Fait partie des spécifications de groupe de largeur nulle.
Remarques:
/
n'est strictement nécessaire dans aucune saveur d'expression régulière. Cependant, il protège au cas où quelqu'un (frisson) fait eval("/" + pattern + "/");
.
,
garantit que si la chaîne est censée être un entier dans le spécificateur numérique, elle provoquera correctement une erreur de compilation RegExp au lieu de se tromper silencieusement.
#
et \s
n'ont pas besoin d'être échappés en JavaScript, mais dans de nombreuses autres versions. Ils sont échappés ici au cas où l'expression régulière serait transmise ultérieurement à un autre programme.
Si vous avez également besoin de pérenniser l'expression régulière contre les ajouts potentiels aux capacités du moteur regex JavaScript, je recommande d'utiliser le plus paranoïaque:
function regExpEscapeFuture(literal_string) {
return literal_string.replace(/[^A-Za-z0-9_]/g, '\\$&');
}
Cette fonction échappe à tous les caractères sauf ceux explicitement garantis de ne pas être utilisés pour la syntaxe dans les futures versions d'expressions régulières.
Pour les véritables amateurs d'assainissement, considérons ce cas de pointe:
var s = '';
new RegExp('(choice1|choice2|' + regExpEscape(s) + ')');
Cela devrait compiler correctement en JavaScript, mais ne le sera pas dans d'autres versions. Si vous avez l'intention de passer à une autre saveur, le cas nul de s === ''
devrait être vérifié indépendamment, comme ceci:
var s = '';
new RegExp('(choice1|choice2' + (s ? '|' + regExpEscape(s) : '') + ')');
RegExp.escape
on travaille actuellement et toute personne qui pense avoir une contribution précieuse est la bienvenue. core-js et autres polyfills le proposent.