test - string to regex javascript




¿Cómo usas una variable en una expresión regular? (12)

Me gustaría crear un método String.replaceAll () en JavaScript y estoy pensando que usar un RegEx sería la forma más tensa de hacerlo. Sin embargo, no puedo averiguar cómo pasar una variable a un RegEx. Puedo hacer esto ya que reemplazará todas las instancias de "B" con "A".

"ABABAB".replace(/B/g, "A");

Pero quiero hacer algo como esto:

String.prototype.replaceAll = function(replaceThis, withThis) {
    this.replace(/replaceThis/g, withThis);
};

Pero obviamente esto solo reemplazará el texto "replaceThis" ... entonces, ¿cómo paso esta variable a mi cadena RegEx?


"ABABAB".replace(/B/g, "A");

Como siempre: no use expresiones regulares a menos que tenga que hacerlo. Para reemplazar una cadena simple, el idioma es:

'ABABAB'.split('B').join('A')

Entonces no tiene que preocuparse por los problemas de cotización mencionados en la respuesta de Gracenotes.


Aquí hay otra implementación replaceAll:

    String.prototype.replaceAll = function (stringToFind, stringToReplace) {
        if ( stringToFind == stringToReplace) return this;
        var temp = this;
        var index = temp.indexOf(stringToFind);
        while (index != -1) {
            temp = temp.replace(stringToFind, stringToReplace);
            index = temp.indexOf(stringToFind);
        }
        return temp;
    };

Desea compilar dinámicamente la expresión regular y para esto la solución adecuada es utilizar el new RegExp(string) constructor new RegExp(string) . Para que el constructor trate literalmente caracteres especiales, debes escapar de ellos. Hay una función incorporada en el widget de autocompletado de la interfaz de usuario de jQuery llamado $.ui.autocomplete.escapeRegex :

[...] puede utilizar la función $.ui.autocomplete.escapeRegex incorporada. Tomará un solo argumento de cadena y escapará a todos los caracteres de expresiones regulares, haciendo que el resultado sea seguro para pasar a un new RegExp() .

Si está utilizando jQuery UI, puede usar esa función o copiar su definición desde la fuente :

function escapeRegex(value) {
    return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
}

Y úsalo así:

"[z-a][z-a][z-a]".replace(new RegExp(escapeRegex("[z-a]"), "g"), "[a-z]");
//            escapeRegex("[z-a]")       -> "\[z\-a\]"
// new RegExp(escapeRegex("[z-a]"), "g") -> /\[z\-a\]/g
// end result                            -> "[a-z][a-z][a-z]"

En lugar de usar la sintaxis /regex/g , puede construir un nuevo objeto RegExp :

var replace = "regex";
var re = new RegExp(replace,"g");

Puede crear dinámicamente objetos de expresiones regulares de esta manera. Entonces harás:

"mystring".replace(re, "newstring");

Ninguna de estas respuestas fue clara para mí. Finalmente encontré una buena explicación en http://burnignorance.com/php-programming-tips/how-to-use-a-variable-in-replace-function-of-javascript/

La respuesta simple es:

var search_term = new RegExp(search_term, "g");    
text = text.replace(search_term, replace_term);

Por ejemplo:

$("button").click(function() {
  Find_and_replace("Lorem", "Chocolate");
  Find_and_replace("ipsum", "ice-cream");
});

function Find_and_replace(search_term, replace_term) {
  text = $("textbox").html();
  var search_term = new RegExp(search_term, "g");
  text = text.replace(search_term, replace_term);
  $("textbox").html(text);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textbox>
  Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum
</textbox>
<button>Click me</button>


Para cualquiera que quiera usar la variable con el método de coincidencia , esto funcionó para mí

var alpha = 'fig';
'food fight'.match(alpha + 'ht')[0]; // fight

Puedes usar esto si $ 1 no funciona contigo

var pattern = new RegExp("amman","i");
"abc Amman efg".replace(pattern,"<b>"+"abc Amman efg".match(pattern)[0]+"</b>");

Si bien puede crear RegExp creados dinámicamente (según las otras respuestas a esta pregunta), String.replace() mi comentario de una publicación similar : la forma funcional de String.replace() es extremadamente útil y en muchos casos reduce la necesidad de Objetos RegExp creados dinámicamente. (que son un tipo de molestia porque tiene que expresar la entrada al constructor RegExp como una cadena en lugar de usar las barras inclinadas / [AZ] + / regexp en formato literal)


Siempre puedes usar indexOf repetidamente:

String.prototype.replaceAll = function(substring, replacement) {
    var result = '';
    var lastIndex = 0;

    while(true) {
        var index = this.indexOf(substring, lastIndex);
        if(index === -1) break;
        result += this.substring(lastIndex, index) + replacement;
        lastIndex = index + substring.length;
    }

    return result + this.substring(lastIndex);
};

Esto no entra en un bucle infinito cuando el reemplazo contiene la coincidencia.


Su solución está aquí:

Pasa una variable a expresión regular.

El que he implementado es tomar el valor de un campo de texto que es el que desea reemplazar y otro es el campo de texto "reemplazar con", obtener el valor del campo de texto en una variable y establecer la variable en RegExp función para reemplazar aún más. En mi caso estoy usando Jquery, también puedes hacerlo solo con JavaScript.

Código de JavaScript:

  var replace =document.getElementById("replace}"); // getting a value from a text field with I want to replace
  var replace_with = document.getElementById("with"); //Getting the value from another text fields with which I want to replace another string.

  var sRegExInput = new RegExp(replace, "g");    
  $("body").children().each(function() {
    $(this).html($(this).html().replace(sRegExInput,replace_with));
  });

Este código está en el evento Onclick de un botón, puede ponerlo en una función para llamar.

Así que ahora puedes pasar la variable en la función de reemplazo.


String.prototype.replaceAll = function (replaceThis, withThis) {
   var re = new RegExp(replaceThis,"g"); 
   return this.replace(re, withThis);
};
var aa = "abab54..aba".replaceAll("\\.", "v");

Prueba con esta tool


String.prototype.replaceAll = function(a, b) {
    return this.replace(new RegExp(a.replace(/([.?*+^$[\]\\(){}|-])/ig, "\\$1"), 'ig'), b)
}

Pruébalo como

var whatever = 'Some [b]random[/b] text in a [b]sentence.[/b]'

console.log(whatever.replaceAll("[", "<").replaceAll("]", ">"))




regex