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]);