610 votes

Existe-t-il une fonction RegExp.escape en JavaScript ?

Je veux juste créer une expression régulière à partir de n'importe quelle chaîne possible.

var usersString = "Hello?!*`~World()[]";
var expression = new RegExp(RegExp.escape(usersString))
var matches = "Hello".match(expression);

Existe-t-il une méthode intégrée pour cela ? Si non, qu'est-ce que les gens utilisent ? Ruby a RegExp.escape . Je n'ai pas l'impression d'avoir besoin d'écrire le mien, il doit bien y avoir quelque chose de standard.

19 votes

Je voulais juste vous informer que RegExp.escape est actuellement en cours de réalisation et toute personne qui pense avoir une contribution précieuse est la bienvenue. core-js et d'autres polyfills l'offrent.

8 votes

Selon le mise à jour récente de cette réponse cette proposition a été rejetée : Voir le numéro

1 votes

Oui, je crois que @BenjaminGruenbaum est peut-être celui qui a fait la proposition. J'ai essayé d'obtenir des exemples de code plus le module npm es-shim dans une réponse sur stack overflow ici : [ stackoverflow.com/a/63838890/5979634 ] car la proposition a finalement été, malheureusement, rejetée. J'espère qu'ils changeront d'avis ou que quelqu'un mettra en place des "balises de modèle" avant que je prenne ma retraite.

790voto

bobince Points 270740

La fonction indiquée dans une autre réponse est insuffisante. Elle ne permet pas d'échapper à ^ o $ (début et fin de la chaîne), ou - qui, dans un groupe de caractères, est utilisé pour les plages.

Utilisez cette fonction :

function escapeRegex(string) {
    return string.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
}

Même si cela peut sembler inutile à première vue, s'échapper - (ainsi que ^ ) rend la fonction appropriée pour l'échappement des caractères à insérer dans une classe de caractères ainsi que dans le corps de la regex.

Échapper à / rend la fonction appropriée pour l'échappement des caractères à utiliser dans un littéral de regex JavaScript pour une évaluation ultérieure.

Comme il n'y a aucun inconvénient à échapper à l'un ou l'autre, il est logique d'échapper pour couvrir des cas d'utilisation plus larges.

Et oui, c'est un défaut décevant que cela ne fasse pas partie du JavaScript standard.

4 votes

@spinningarrow : Il représente la chaîne entière mise en correspondance, comme 'groupe 0' dans de nombreux autres systèmes de regex. doc

2 votes

Je crois que la réponse originale était correcte, avant la modification. Je suis presque sûr que l'échappement de la barre oblique à l'intérieur de la classe de caractères n'est pas nécessaire. Cela ne semble pas faire de mal, mais ce n'est pas nécessaire.

23 votes

En fait, nous n'avons pas besoin de nous échapper / du tout

48voto

user113215 Points 4402

Guide des expressions régulières du Mozilla Developer Network fournit cette fonction d'échappement :

function escapeRegExp(string) {
  return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
}

0 votes

@DanDascalescu Vous avez raison. La page MDN a été mise à jour et = n'est plus inclus.

22voto

Pierluc SS Points 1301

Dans le widget autocomplete de jQuery UI (version 1.9.1), ils utilisent une expression régulière légèrement différente (ligne 6753), voici l'expression régulière combinée à L'approche de Bobince .

RegExp.escape = function( value ) {
     return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&");
}

4 votes

La seule différence est qu'ils s'échappent , (qui n'est pas un métacaractère), et # et les espaces blancs qui ne comptent qu'en mode espacement libre (qui n'est pas pris en charge par JavaScript). Cependant, ils ont bien compris qu'il ne faut pas échapper la barre oblique.

20 votes

Si vous voulez réutiliser l'implémentation de jquery UI plutôt que de coller le code localement, optez pour $.ui.autocomplete.escapeRegex(myString) .

3 votes

Lodash a aussi cela, _. escapeRegExp et npmjs.com/package/lodash.escaperegexp

5voto

kzh Points 5098

C'est une version plus courte.

RegExp.escape = function(s) {
    return s.replace(/[$-\/?[-^{|}]/g, '\\$&');
}

Cela inclut les caractères non-méta de % , & , ' y , mais la spécification RegExp de JavaScript le permet.

3 votes

Je n'utiliserais pas cette version "courte", car les plages de caractères cachent la liste des caractères, ce qui rend plus difficile la vérification de l'exactitude au premier coup d'œil.

0 votes

@nhahtdh Je ne le ferais probablement pas non plus, mais il est affiché ici pour information.

0 votes

@kzh : poster "pour information" aide moins que poster pour comprendre. N'êtes-vous pas d'accord pour dire que ma réponse est plus clair ?

0voto

Dan Dascalescu Points 8165

Les fonctions dans les autres réponses sont inutiles pour l'échappement d'expressions régulières entières (elles peuvent être utiles pour l'échappement de pièces d'expressions régulières qui seront plus tard concaténées en de plus grandes regexps).

Si vous échappez une regexp entière et que vous en avez fini avec elle, vous pouvez citer les métacaractères qui sont soit autonomes ( . , ? , + , * , ^ , $ , | , \ ) ou de commencer quelque chose ( ( , [ , { ) est tout ce dont vous avez besoin :

String.prototype.regexEscape = function regexEscape() {
  return this.replace(/[.?+*^$|({[\\]/g, '\\$&');
};

Et oui, c'est décevant que JavaScript n'ait pas une fonction comme celle-ci intégrée.

1 votes

Disons que vous échappez l'entrée de l'utilisateur (text)next et l'insérer : (?: + entrée + ) . Votre méthode donnera la chaîne de caractères suivante (?:\(text)next) qui ne parvient pas à compiler. Notez qu'il s'agit d'une insertion tout à fait raisonnable, pas d'une insertion folle comme re\ + entrée + re (dans ce cas, on peut reprocher au programmeur d'avoir fait quelque chose de stupide)

1 votes

@nhahtdh : ma réponse mentionnait spécifiquement l'échappement d'expressions régulières entières et "en avoir fini" avec elles, pas des parties (ou des parties futures) de regexps. Pourriez-vous annuler le downvote ?

1 votes

Il est rare que l'on doive échapper l'expression entière - il existe des opérations sur les chaînes de caractères, qui sont beaucoup plus rapides que les regex si l'on veut travailler avec des chaînes littérales.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X