Estoy diseñando un probador de expresiones regulares en HTML y JavaScript. El usuario ingresará una expresión regular, una cadena y elegirá la función con la que desea probar (por ejemplo, buscar, igualar, reemplazar, etc.) mediante un botón de opción y el programa mostrará los resultados cuando esa función se ejecute con los argumentos especificados. Naturalmente, habrá cuadros de texto adicionales para reemplazar los argumentos adicionales y demás.
Mi problema es obtener la cadena del usuario y convertirla en una expresión regular. Si digo que no necesitan tener //
alrededor de la expresión regular que ingresan, entonces no pueden establecer banderas, como g
y i
. Entonces tienen que tener los //
's alrededor de la expresión, pero ¿cómo puedo convertir esa cadena en una expresión regular? No puede ser un literal ya que es una cadena, y no puedo pasarlo al constructor RegExp ya que no es una cadena sin el //
's. ¿Hay alguna otra forma de convertir una cadena de entrada de usuario en una expresión regular? ¿Tendré que analizar la cadena y las banderas de la expresión regular con los //
's y luego construirla de otra manera? ¿Debo hacer que ingresen una cadena y luego ingresen las banderas por separado?
fuente
var re = new RegExp("\\w+");
<input>
etiqueta HTML.var re = new RegExp("\"\\w+\"");
es un ejemplo de una expresión regular codificada usando el constructor RegExp y es necesario el escape de las comillas dobles . Lo que quiero decir con una cadena en una variable es que solo puede hacervar re = new RegExp(str);
ystr
puede contener comillas dobles o barras invertidas sin problema.o
fuente
/\/
se reconoce una entrada no válida como .Aquí hay una frase:
str.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&')
Lo obtuve del módulo NPM escape-string-regexp .
Probándolo:
Uso de literales de plantilla etiquetados con soporte de banderas:
fuente
Use el constructor de objetos JavaScript RegExp .
Puede pasar banderas como un segundo argumento de cadena al constructor. Consulte la documentación para más detalles.
fuente
En mi caso, la entrada del usuario a veces estaba rodeada de delimitadores y, a veces, no. por eso agregué otro caso ...
fuente
.split()
función en lugar de una larga cadena de expresiones regulares.regParts = inputstring.split('/')
esto haría queregParts[1]
la cadena de expresiones regulares yregParts[2]
los delimitadores (suponiendo que la configuración de la expresión regular sea/.../gim
). Puede comprobar si hay delimitadores conregParts[2].length < 0
.Le sugiero que también agregue casillas de verificación separadas o un campo de texto para las banderas especiales. De esta manera, está claro que el usuario no necesita agregar ninguno
//
. En el caso de un reemplazo, proporcione dos campos de texto. Esto hará tu vida mucho más fácil.¿Por qué? Porque de lo contrario, algunos usuarios agregarán
//
's' mientras que otros no. Y algunos harán un error de sintaxis. Luego, después de despojar los//
's, puede terminar con una expresión regular sintácticamente válida que no se parece en nada a lo que el usuario pretendía, lo que lleva a un comportamiento extraño (desde la perspectiva del usuario).fuente
Esto funcionará también cuando la cadena no sea válida o no contenga banderas, etc.
fuente
Si realmente desea convertir una cadena en una expresión regular, intente usar la siguiente función:
Puedes usarlo así:
Como referencia, aquí está la versión formateada y más moderna:
fuente
Gracias a las respuestas anteriores, este bloque sirve como una solución de propósito general para aplicar una cadena configurable en un RegEx ... para filtrar texto:
fuente
Puedes pedir banderas usando casillas de verificación y luego hacer algo como esto:
fuente
Yo uso
eval
para resolver este problema.Por ejemplo:
fuente