validar regulares regular online numeros expresiones expresion especiales espacio ejemplos contraseña caracteres blanco alfanumerico javascript html regex

javascript - regulares - Convertir la cadena de entrada del usuario a una expresión regular



validar contraseña javascript expresiones regulares (9)

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, relacionar, reemplazar, etc.) mediante el botón de radio y el programa mostrará los resultados cuando esa función se ejecute con los argumentos especificados. Naturalmente, habrá cuadros de texto adicionales para los argumentos adicionales a reemplazar y tal.

Mi problema es obtener la cadena del usuario y convertirla en una expresión regular. Si digo que no necesitan tener // ''s alrededor de la expresión regular que ingresan, entonces no pueden establecer indicadores, como g y i . Así que tienen que tener los // ''alrededor de la expresión, pero ¿cómo puedo convertir esa cadena a 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 los // ''s. ¿Hay alguna otra manera de convertir una cadena de entrada de usuario en una expresión regular? ¿Tendré que analizar la cadena y los indicadores de la expresión regular con los // ''s para luego construirlos de otra manera? ¿Debo hacer que ingresen una cadena y luego ingresar las banderas por separado?


Aquí hay una sola línea: str.replace(/[|//{}()[/]^$+*?.]/g, ''//$&'')

Lo obtuve del módulo NPM escape-string-regexp .

Probando:

escapeStringRegExp.matchOperatorsRe = /[|//{}()[/]^$+*?.]/g; function escapeStringRegExp(str) { return str.replace(escapeStringRegExp.matchOperatorsRe, ''//$&''); } console.log(new RegExp(escapeStringRegExp(''example.com''))); // => /example/.com/


En mi caso, la entrada del usuario a veces estaba rodeada de delimitadores y otras veces no. Por eso agregué otro caso ..

var regParts = inputstring.match(/^//(.*?)//([gim]*)$/); if (regParts) { // the parsed pattern had delimiters and modifiers. handle them. var regexp = new RegExp(regParts[1], regParts[2]); } else { // we got pattern string without delimiters var regexp = new RegExp(inputstring); }


Esto funcionará también cuando la cadena no sea válida o no contenga marcas, etc.

function regExpFromString(q) { let flags = q.replace(/.*//([gimuy]*)$/, ''$1''); if (flags === q) flags = ''''; let pattern = (flags ? q.replace(new RegExp(''^/(.*?)/'' + flags + ''$''), ''$1'') : q); try { return new RegExp(pattern, flags); } catch (e) { return null; } } console.log(regExpFromString(''//bword//b'')); console.log(regExpFromString(''////bword//b//gi''));


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:

var permittedChars = ''^a-z0-9 _,.?!@+<>''; permittedChars = ''['' + permittedChars + '']''; var flags = ''gi''; var strFilterRegEx = new RegExp(permittedChars, flags); log.debug (''strFilterRegEx: '' + strFilterRegEx); strVal = strVal.replace(strFilterRegEx, ''''); // this replaces hard code solt: // strVal = strVal.replace(/[^a-z0-9 _,.?!@+]/ig, '''');


Le sugiero que también agregue casillas de verificación separadas o un campo de texto para las banderas especiales. De esta forma queda claro que el usuario no necesita agregar ningún // ''s. En el caso de un reemplazo, proporcione dos campos de texto. Esto hará que tu vida sea mucho más fácil.

¿Por qué? Porque de lo contrario, algunos usuarios agregarán // ''s mientras que otros no. Y algunos cometen un error de sintaxis. Luego, después de eliminar los // ''s, puede terminar con una expresión regular sintácticamente válida que no se parece en nada a la intención del usuario, lo que lleva a un comportamiento extraño (desde la perspectiva del usuario).


Puedes pedir banderas usando casillas de verificación y luego hacer algo como esto:

var userInput = formInput; var flags = ''''; if(formGlobalCheckboxChecked) flags += ''g''; if(formCaseICheckboxChecked) flags += ''i''; var reg = new RegExp(userInput, flags);


Utilice el constructor de objetos RegExp de JavaScript .

var re = new RegExp("//w+"); re.test("hello");

Puede pasar banderas como un segundo argumento de cadena al constructor. Consulte la documentación para más detalles.


Utilice el constructor de objetos RegExp para crear una expresión regular a partir de una cadena:

var re = new RegExp("a|b", "i"); // same as var re = /a|b/i;


var flags = inputstring.replace(/.*//([gimy]*)$/, ''$1''); var pattern = inputstring.replace(new RegExp(''^/(.*?)/''+flags+''$''), ''$1''); var regex = new RegExp(pattern, flags);

o

var match = inputstring.match(new RegExp(''^/(.*?)/([gimy]*)$'')); // sanity check here var regex = new RegExp(match[1], match[2]);