Solución:
Para crear la expresión regular a partir de una cadena, debe usar JavaScript RegExp
objeto.
Si también desea hacer coincidir / reemplazar más de una vez, entonces deber añade el g
(coincidencia global) bandera. He aquí un ejemplo:
var stringToGoIntoTheRegex = "abc";
var regex = new RegExp("#" + stringToGoIntoTheRegex + "#", "g");
// at this point, the line above is the same as: var regex = /#abc#/g;
var input = "Hello this is #abc# some #abc# stuff.";
var output = input.replace(regex, "!!");
alert(output); // Hello this is !! some !! stuff.
Demostración de JSFiddle aquí.
En el caso general, escape la cadena antes de usarla como expresión regular:
Sin embargo, no todas las cadenas son expresiones regulares válidas: hay algunos caracteres especiales, como (
o [
. Para solucionar este problema, simplemente escape la cadena antes de convertirla en una expresión regular. Una función de utilidad para eso va en el siguiente ejemplo:
function escapeRegExp(stringToGoIntoTheRegex) {
return stringToGoIntoTheRegex.replace(/[-/\^$*+?.()|[]{}]/g, '\$&');
}
var stringToGoIntoTheRegex = escapeRegExp("abc"); // this is the only change from above
var regex = new RegExp("#" + stringToGoIntoTheRegex + "#", "g");
// at this point, the line above is the same as: var regex = /#abc#/g;
var input = "Hello this is #abc# some #abc# stuff.";
var output = input.replace(regex, "!!");
alert(output); // Hello this is !! some !! stuff.
Demostración de JSFiddle aquí.
Nota: la expresión regular en la pregunta usa la s
modificador, que no existía en el momento de la pregunta, pero existe — a s
(dotall) marca / modificador en JavaScript – hoy.
Si está intentando utilizar un valor de variable en la expresión, debe utilizar el “constructor” de RegExp.
var regex="(?!(?:[^<]+>|[^>]+</a>))b(" + value + ")b";
new RegExp(regex, "is")
No necesitas el "
para definir una expresión regular tan solo:
var regex = /(?!(?:[^<]+>|[^>]+</a>))b(value)b/is; // this is valid syntax
Si value
es una variable y desea una expresión regular dinámica, entonces no puede usar esta notación; use la notación alternativa.
String.replace
también acepta cadenas como entrada, por lo que puede hacer "fox".replace("fox", "bear");
Alternativa:
var regex = new RegExp("/(?!(?:[^<]+>|[^>]+</a>))b(value)b/", "is");
var regex = new RegExp("/(?!(?:[^<]+>|[^>]+</a>))b(" + value + ")b/", "is");
var regex = new RegExp("/(?!(?:[^<]+>|[^>]+</a>))b(.*?)b/", "is");
Tenga en cuenta que si value
contiene caracteres de expresiones regulares como (
, [
y ?
tendrás que escapar de ellos.