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 gy 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);ystrpuede 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
evalpara resolver este problema.Por ejemplo:
fuente