Solo quiero crear una expresión regular a partir de cualquier cadena posible.
var usersString = "Hello?!*`~World()[]";
var expression = new RegExp(RegExp.escape(usersString))
var matches = "Hello".match(expression);
¿Hay un método incorporado para eso? Si no, ¿qué usa la gente? Ruby tiene RegExp.escape
. No siento que necesite escribir el mío, debe haber algo estándar por ahí. ¡Gracias!
javascript
regex
Lance Pollard
fuente
fuente
RegExp.escape
se trabaja actualmente y cualquier persona que piense que tiene un aporte valioso es bienvenido a contribuir. core-js y otros polyfills lo ofrecen.Respuestas:
La función vinculada anteriormente es insuficiente. No puede escapar
^
o$
(inicio y final de la cadena), o-
, que en un grupo de caracteres se usa para rangos.Utiliza esta función:
Si bien puede parecer innecesario a primera vista, el escape
-
(así como^
) hace que la función sea adecuada para insertar caracteres de escape en una clase de caracteres, así como en el cuerpo de la expresión regular.Escapar
/
hace que la función sea adecuada para caracteres de escape que se utilizarán en un literal JS regex para una evaluación posterior.Como no hay inconveniente en escapar de ninguno de ellos, tiene sentido escapar para cubrir casos de uso más amplios.
Y sí, es un fracaso decepcionante que esto no sea parte del JavaScript estándar.
fuente
/
en absolutoquotemeta
(\Q
), Pythonre.escape
, PHPpreg_quote
, RubyRegexp.quote
...var e = /[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g;
y luego su función es Dereturn s.replace(e, '\\$&');
esta manera, solo crea una instancia de RegExp una vez.RegExp.escape
cuya implementación difiere de la suya? ¿No sería mejor que esta función no se adjunte a nada?Para cualquiera que use lodash, desde v3.0.0 se incluye una función _.escapeRegExp :
Y, en el caso de que no desee requerir la biblioteca completa de lodash, ¡puede requerir solo esa función !
fuente
escapeRegExp
función.La mayoría de las expresiones aquí resuelven casos de uso específicos individuales.
Eso está bien, pero prefiero un enfoque de "siempre funciona".
Esto "escapará completamente" de una cadena literal para cualquiera de los siguientes usos en expresiones regulares:
new RegExp(regExpEscape(str))
new RegExp('[' + regExpEscape(str) + ']')
new RegExp('x{1,' + regExpEscape(str) + '}')
Caracteres especiales cubiertos:
-
: Crea un rango de caracteres en una clase de caracteres.[
/]
: Inicia / finaliza una clase de caracteres.{
/}
: Inicia / finaliza un especificador de numeración.(
/)
: Inicia / finaliza un grupo.*
/+
/?
: Especifica el tipo de repetición..
: Coincide con cualquier personaje.\
: Escapa de caracteres e inicia entidades.^
: Especifica el inicio de la zona de coincidencia y niega la coincidencia en una clase de caracteres.$
: Especifica el final de la zona coincidente.|
: Especifica la alternancia.#
: Especifica el comentario en el modo de espacio libre.\s
: Ignorado en el modo de espacio libre.,
: Separa los valores en el especificador de numeración./
: Inicia o finaliza la expresión.:
: Completa tipos de grupos especiales y parte de las clases de personajes de estilo Perl.!
: Niega el grupo de ancho cero.<
/=
: Parte de las especificaciones de grupo de ancho cero.Notas:
/
no es estrictamente necesario en ningún sabor de expresión regular. Sin embargo, protege en caso de que alguien (estremecimiento) lo hagaeval("/" + pattern + "/");
.,
garantiza que si la cadena está destinada a ser un número entero en el especificador numérico, provocará correctamente un error de compilación RegExp en lugar de compilar en silencio incorrectamente.#
, y\s
no necesita ser escapado en JavaScript, pero sí en muchos otros sabores. Aquí se escapan en caso de que la expresión regular se pase luego a otro programa.Si también necesita probar la expresión regular en el futuro contra posibles adiciones a las capacidades del motor de expresión regular de JavaScript, le recomiendo usar el más paranoico:
Esta función escapa a todos los caracteres, excepto aquellos explícitamente garantizados que no se utilizarán para la sintaxis en futuros sabores de expresiones regulares.
Para los verdaderamente interesados en el saneamiento, considere este caso extremo:
Esto debería compilarse bien en JavaScript, pero no en otros sabores. Si tiene la intención de pasar a otro sabor, el caso nulo de
s === ''
debe verificarse de forma independiente, así:fuente
/
no necesita ser escapado de la[...]
clase de caracteres.La Guía de Mozilla Developer Network para expresiones regulares proporciona esta función de escape:
fuente
=
ya no está incluida.En el widget de autocompletado de jQueryUI (versión 1.9.1) usan una expresión regular ligeramente diferente (Línea 6753), aquí está la expresión regular combinada con el enfoque @bobince.
fuente
,
(que no es un metacarácter)#
y espacios en blanco que solo importan en el modo de espacio libre (que no es compatible con JavaScript). Sin embargo, hacen bien en no escapar de la barra diagonal.$.ui.autocomplete.escapeRegex(myString)
.Nada debería evitar que escapes de todos los caracteres no alfanuméricos:
Pierdes un cierto grado de legibilidad al hacerlo,
re.toString()
pero ganas mucha simplicidad (y seguridad).De acuerdo con ECMA-262, por un lado, la expresión "caracteres de sintaxis" regulares son siempre no alfanumérico, tal que el resultado es seguro, y secuencias de escape especiales (
\d
,\w
,\n
) siempre son alfanuméricos de tal manera que no se producirán fugas de control falsos .fuente
.replace(/[^\w]/g, '\\$&')
funcionaría de la misma manera.new RegExp('🍎'.replace(/(?=\W)/g, '\\'), 'u')
arroja una excepción porque\W
coincide con cada unidad de código de un par sustituto por separado, lo que resulta en códigos de escape no válidos..replace(/\W/g, "\\$&");
Hay una propuesta de ES7 para RegExp.escape en https://github.com/benjamingr/RexExp.escape/ , con un polyfill disponible en https://github.com/ljharb/regexp.escape .
fuente
Esta es una versión más corta.
Esto incluye los caracteres que no son de meta
%
,&
,'
, y,
, aunque la especificación JavaScript RegExp lo permite.fuente
.
se echa de menos. Y()
. ¿O no?[-^
es extraño. No recuerdo lo que hay ahí.XRegExp tiene una función de escape:
XRegExp.escape('Escaped? <.>'); // -> 'Escaped\?\ <\.>'
Más en: http://xregexp.com/api/#escape
fuente
En lugar de solo caracteres de escape que causarán problemas en su expresión regular (por ejemplo: una lista negra), ¿por qué no considerar usar una lista blanca? De esta manera, cada personaje se considera contaminado a menos que coincida.
Para este ejemplo, suponga la siguiente expresión:
Esto incluye letras blancas, números y espacios:
Devoluciones:
Esto puede escapar de los personajes que no es necesario escapar, pero esto no obstaculiza su expresión (quizás algunas penalizaciones menores de tiempo, pero vale la pena por seguridad).
fuente
fuente
Las funciones en las otras respuestas son excesivas para escapar de expresiones regulares enteras (pueden ser útiles para escapar de partes de expresiones regulares que luego se concatenarán en expresiones regulares más grandes).
Si escapar de una expresión regular entero y terminado con él, citando a los meta-caracteres que son o independiente (
.
,?
,+
,*
,^
,$
,|
,\
) o iniciar algo ((
,[
,{
) es todo lo que necesita:Y sí, es decepcionante que JavaScript no tenga una función como esta incorporada.
fuente
(text)next
y la inserta en:(?:
+ input +)
. Su método le dará la cadena resultante(?:\(text)next)
que no se compila. Tenga en cuenta que esta es una inserción bastante razonable, no una loca comore\
+ input +re
(en este caso, se puede culpar al programador por hacer algo estúpido)\
debe escapar, ya que su expresión regular se dejará\w
intacta. Además, JavaScript no parece permitir el rastreo)
, al menos para eso es que Firefox arroja el error.)
Otro enfoque (mucho más seguro) es escapar de todos los caracteres (y no solo de algunos especiales que conocemos actualmente) utilizando el formato de escape unicode
\u{code}
:Tenga en cuenta que debe pasar la
u
bandera para que este método funcione:fuente
Solo ha habido y habrá 12 metacaracteres que deben escaparse
para considerarse literal.
No importa lo que se haga con la cadena escapada, insertada en una
envoltura de expresiones regulares equilibrada , añadida, no importa.
Haga un reemplazo de cadena usando esto
fuente
]
?