Est-il une RegExp.s'échapper de la fonction en Javascript?
Je veux juste créer une expression régulière en dehors de toute chaîne possible.
var usersString = "Hello?!*`~World()[]";
var expression = new RegExp(RegExp.escape(usersString))
var matches = "Hello".match(expression);
Est-il une méthode intégrée pour qui? Si non, que les gens utilisent-ils? Ruby a RegExp.escape
. Je ne me sens pas comme si j'avais besoin d'écrire ma propre, il doit bien y avoir quelque chose de standard là-bas. Merci!
- Voulais juste vous mettre à jour amende folk
RegExp.escape
est actuellement travaillé sur et de toute personne qui pense qu'ils ont de précieux commentaires sont les bienvenus pour contribuer. core-js et d'autres polyfills l'offrir. - Selon le mise à jour récente de cette réponse cette proposition a été rejetée: Voir l'émission
Vous devez vous connecter pour publier un commentaire.
La relation entre la fonction ci-dessus est insuffisante. Il ne parvient pas à échapper
^
ou$
(de début et de fin de chaîne), ou-
, qui, dans un groupe de caractères est utilisé pour des gammes.Utiliser cette fonction:
Bien qu'il peut sembler inutile à première vue, échappant
-
(ainsi que^
) rend la fonction appropriée pour échapper les caractères à insérer dans une classe de caractères, ainsi que le corps de la regex.Échapper
/
rend la fonction appropriée pour échapper les caractères à être utilisé dans un JS regex littéral pour plus tard eval.Comme il n'y a aucun inconvénient à échapper à l'un ou l'autre, il fait sens pour échapper à couvrir un plus large éventail de cas d'utilisation.
Et oui, c'est un résultat décevant à défaut que ce n'est pas une partie de JavaScript standard.
$&
faire?/
à tous'a\.b'
==='a.b'
🙂a\.b
dans un pseudo-littéralement"a\.b"
, qui est trompeuse, car elle n'est pas valide d'un littéral de chaîne de valeur (ce qui devrait être"a\\.b"
. Merci pour l'inutile, de la confusion supplémentaire, les navigateurs.quotemeta
(\Q
), Pythonre.escape
, PHPpreg_quote
, RubyRegexp.quote
...var e = /[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g;
et puis, votre fonction estreturn s.replace(e, '\\$&');
Cette façon, vous n'instancier la RegExp une fois."
est particulier dans la syntaxe regex donc je ne suis pas sûr de ce que le bénéfice pourrait être.RegExp.escape
dont la mise en œuvre diffère de la vôtre? Ne serait-il pas mieux pour cette fonction, de ne pas être attaché à quelque chose?/
dans les classes de personnage, même si c'est mieux de s'échapper afin de tenir compte de certains éditeurs. Voir ce question.RegExp("1.3")
retour/1.3/
qui est totalement inacceptable. Pi Marillion réponse ci-dessous fonctionne bien lorsque nourris avec des nombres qui contiennent les points décimaux.RegExp
constructeur au lieu deRegexp.escape
...String(s).replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
Cela aide quand votre chaîne est un nombre, par exemple.no-useless-escape
): Inutile caractère d'échappement: \//[$(-+.\/?[-^{|}]/
(permet d'économiser de 5 caractères). Vous n'avez pas besoin d'échapper à-
parce que vous avez déjà échappé[
et]
et cela signifie qu'il ne sera pas groupes de caractères. Aussi, il y a deux séquences de caractères qui peut être écrite sous forme de fourchettes. Entre(
et+
(40 à 43) et une autre entre les[
et^
(91 à 94)."
à\"
et'
à\'
?str.replace(/[\-\[\]\/\{\}\(\)\"\'\*\+\?\.\\\^\$\|]/g, "\\$&");
handlebarsjs
helper ou tout autre moteur de rendu, par exemple si j'utilisehandlebarsjs
de rendre un fichier JS où j'aivar JSstr = '{{{myStr}}}';
oùmyStr = "I'm here"
. Si je ne suis pas d'échapper les guillemets-je obtenirvar JSstr = 'I'm here'
. Mais je suis conscient que c'est une très particulier et spécifique de la situation.myStr
ne rendrait pas le résultat correct, même si les citations ont été échappé. Si vous êtes à la rédaction d'une chaîne dans une regex à l'intérieur un littéral de chaîne, vous auriez besoin de regex échapper d'abord, et ensuite chaîne littérale échapper les résultats (afin par exemple d'une barre oblique inverse se termine comme une quadruple-barre oblique inverse).<html data-jsstr="{{myStr}}">
, à l'aide de guidon est normal HTML échapper), et puis en lisant le contenu de l'attribut statique JS.string.replaceAll(haystack, needle, replace)
fonction. Il appellehaystack.replace( new RegExp( escape(needle), 'g' ), replace);
mais je viens de trouver un cas limite où il se casse: 'string en paramètre' donc, si lereplace
param contient, par exemple,$'
ma fonction renvoie des résultats bizarres. Une idée de comment résoudre ce problème? Voir developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...Pour toute personne utilisant les lodash, depuis la v3.0.0 un _.escapeRegExp fonction est intégrée:
Et, dans le cas où vous ne voulez pas besoin de l'ensemble des lodash de la bibliothèque, vous pouvez avoir besoin de juste que la fonction!
escapeRegExp
fonction.La plupart des expressions ici résoudre des cas d'utilisation spécifiques.
C'est pas mal, mais je préfère une "marche toujours" approche.
Ce sera "totalement échapper à" une chaîne de caractères pour toutes les utilisations suivantes des expressions régulières:
new RegExp(regExpEscape(str))
new RegExp('[' + regExpEscape(str) + ']')
new RegExp('x{1,' + regExpEscape(str) + '}')
Caractères Spéciaux Couverts:
-
: Crée un sous-ensemble de caractères dans une classe de caractères.[
/]
: Commence ou se termine un caractère de classe.{
/}
: Commence ou se termine un spécificateur de la numération.(
/)
: Commence ou se termine un groupe.*
/+
/?
: Spécifie répétition..
: Correspond à tout caractère.\
: Échappe les caractères, et commence à les entités.^
: Spécifie le début de la zone de correspondance, et nie correspondant dans une classe de caractères.$
: Indique la fin de la zone de correspondance.|
: Spécifie l'alternance.#
: Spécifie commentaire en libre mode d'espacement.\s
: Ignoré en libre mode d'espacement.,
: Sépare les valeurs dans la numération spécificateur./
: Commence ou se termine expression.:
: Complète le groupe spécial des types, et une partie de Perl style des classes de caractères.!
: Nie zéro-largeur groupe.<
/=
: Partie de zéro-largeur groupe de spécifications.Notes:
/
n'est pas strictement nécessaire dans le goût de l'expression régulière. Toutefois, il protège au cas où quelqu'un (frisson) neeval("/" + pattern + "/");
.,
assure que si la chaîne est destinée à être un nombre entier dans le numérique prescripteur, il va provoquer une RegExp erreur de compilation au lieu d'en silence de la compilation de mal.#
, et\s
n'ont pas besoin d'être échappés en JavaScript, mais dans beaucoup d'autres saveurs. Ils se sont échappés ici dans le cas où l'expression régulière sera ensuite transmise à un autre programme.Si vous avez aussi besoin d'assurer la pérennité de l'expression régulière contre d'éventuels ajouts à la JavaScript moteur d'expressions régulières capacités, je recommande d'utiliser le plus paranoïaque:
Cette fonction échappe à tous les caractères sauf ceux explicitement la garantie de ne pas être utilisé pour la syntaxe à l'avenir expression régulière saveurs.
Pour la vraiment de l'assainissement-vif, d'envisager ce cas de bord:
Ce devrait compiler fine en JavaScript, mais pas dans certains autres saveurs. Si l'intention de passer à une autre saveur, la valeur null de
s === ''
doit être vérifiée indépendamment, comme suit:/
n'a pas besoin d'être échappés dans la[...]
classe de personnage.var e = /[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g;
et alors la fonction est commereturn s.replace(e, '\\$&');
. Pour éviter manuellement s'échapper de la chaîne d'échappement je veux d'abord utiliser la fonction d'origineregExpEscape
échapper à votre chaîne d'échappement (see), puis utiliseze = new RegExp(ees,"g")
et puisfunction regExpEscapeFast(literal_string) { return literal_string.replace(e, '\\$&');}
. Je ne peux pas le faire fonctionner. Comment bien s'échapper de la chaîne d'échappement?Mozilla Developer Network Guide pour les Expressions Régulières fournit échapper à cette fonction:
=
? Autant que je sache, ce serait utile pour Perl anticipation des expressions régulières (?=
), mais si vous échapper à la?
, vous êtes bon pour aller.=
n'est plus inclus.Dans jQueryUI de la saisie semi-automatique widget (version 1.9.1) ils ont un peu différent regex (Ligne 6753), voici l'expression régulière combinée avec @bobince approche.
,
(ce qui n'est pas un caractère de remplacement), et#
et les espaces qui seule question en libre-mode d'espacement (ce qui n'est pas pris en charge par JavaScript). Cependant, ils ne l'obtenez droit de ne pas échapper à la barre oblique.$.ui.autocomplete.escapeRegex(myString)
.Rien ne vous empêche de vous simplement échapper à tout caractère non alphanumérique:
Vous perdez un certain degré de lisibilité lors
re.toString()
mais vous gagnez beaucoup de simplicité (et la sécurité).Selon l'ECMA-262, d'une part, de l'expression régulière "syntaxe de" personnages sont toujours non-alphanumériques, tels que la conséquence est sécuriser, et des séquences d'échappement (
\d
,\w
,\n
) sont toujours alphanumériques, tels que, sans fausse contrôle échappe seront produites..replace(/[^\w]/g, '\\$&')
fonctionnerait de la même façon.new RegExp(''.replace(/(?=\W)/g, '\\'), 'u')
throws exception parce que\W
correspond à chaque unité de code d'une paire de substitution séparément, résultant non valides des codes d'échappement..replace(/\W/g, "\\$&");
Il y a un ES7 proposition de RegExp.échapper à https://github.com/benjamingr/RexExp.escape/, avec un polyfill disponible à https://github.com/ljharb/regexp.escape.
C'est une version plus courte.
Cela inclut la non-méta-caractères de
%
,&
,'
, et,
, mais le JavaScript RegExp spécification permet..
est raté. Et()
. Ou pas?[-^
est étrange. Je ne me souviens pas de ce qui est là.XRegExp a une fonction d'échappement:
XRegExp.escape('Escaped? <.>');
//-> 'Escaped\?\ <\.>'
Plus sur: http://xregexp.com/api/#escape
Plutôt que de seulement s'échapper les caractères qui va causer des problèmes dans votre expression régulière (par exemple: une liste noire), pourquoi ne pas envisager d'utiliser une liste blanche à la place. De cette façon, chaque personnage est considéré comme contaminé, sauf si elle correspond.
Pour cet exemple, supposons que l'expression suivante:
Cette listes blanches des lettres, le nombre et les espaces:
Retourne:
Cela peut échapper à des personnages qui n'ont pas besoin d'être échappé, mais cela ne veut pas nuire à votre expression (peut-être quelques petites pénalités de temps - mais ça vaut le coup de la sécurité).
Les fonctions dans les autres réponses sont overkill pour échapper à toute les expressions régulières (ils peuvent être utiles pour échapper à pièces des expressions régulières qui seront ensuite concaténés en plus les expressions régulières).
Si vous échapper toute une regexp et sont fait avec elle, citant les caractères de remplacement qui sont, soit de manière autonome (
.
,?
,+
,*
,^
,$
,|
,\
) ou de commencer quelque chose ((
,[
,{
) est tout ce dont vous avez besoin:Et oui, c'est décevant que JavaScript n'est pas une fonction comme ceci intégré.
(text)next
et l'insérer dans:(?:
+ entrée +)
. Votre méthode donnera la chaîne résultante(?:\(text)next)
qui ne peut pas compiler. Notez que cela est tout à fait raisonnable d'insertion, et non comme un fou commere\
+ entrée +re
(dans ce cas, le programmeur peut être blâmé pour faire quelque chose de stupide)\
devrait être échappé, depuis votre regex laissera\w
intacte. Aussi, JavaScript ne semble pas permettre de fuite)
, au moins c'est ce que Firefox déclenche une erreur pour.`
dans la réponse. Merci!)
Un autre (bien sûr) l'approche est d'échapper à tous les personnages (et pas juste un peu spéciale que nous connaissons actuellement) à l'aide de l'échappement unicode format
\u{code}
:Veuillez noter que vous devez passer la
u
drapeau pour que cette méthode fonctionne:Il n'y a jamais été et ne sera jamais 12 méta-caractères doivent être échappés
pour être considéré comme un littéral.
N'a pas d'importance ce qui est fait avec les échappé à la chaîne, inséré dans un équilibre
regex wrapper, en annexe, n'a pas d'importance.
Faire une chaîne de remplacer l'utilisation de ce
]
?