JavaScript: usar variable en la coincidencia de cadenas

89

Encontré varias preguntas similares, pero no me ayudó. Entonces tengo este problema:

var xxx = "victoria";
var yyy = "i";
alert(xxx.match(yyy/g).length);

No sé cómo pasar la variable en el comando de coincidencia. Por favor ayuda. Gracias.

mesnicka
fuente
1
Duplicado exacto de ¿Cómo se pasa una variable a un JavaScript de expresión regular? . Buscar más;)
Dan Dascalescu
Una cosa más: si está utilizando una variable para construir una expresión regular, se debe tener cuidado de que la variable pueda contener caracteres especiales de expresión regular. por ejemplo, si pasa "c ++", el compilador de SyntaxError: Invalid regular expression: /c++/: Nothing to repeat
expresiones

Respuestas:

187

Aunque la función de coincidencia no acepta literales de cadena como patrones de expresiones regulares, puede usar el constructor del objeto RegExp y pasarlo a la función String.match:

var re = new RegExp(yyy, 'g');
xxx.match(re);

Cualquier indicador que necesite (como / g) puede ir al segundo parámetro.

Chris Hutchinson
fuente
2
+1, esta es la forma preferida, por cierto, si el argumento pasado al matchmétodo no es un RegExpobjeto, internamente el RegExpconstructor será invocado usando ese valor, por lo que puede usar un patrón de cadena , por ejemplo:"a123".match("\\d+")[0] === "123";
Christian C. Salvadó
10

Tienes que usar el objeto RegExp si tu patrón es una cadena

var xxx = "victoria";
var yyy = "i";
var rgxp = new RegExp(yyy, "g");
alert(xxx.match(rgxp).length);

Si el patrón no es una cadena dinámica:

var xxx = "victoria";
var yyy = /i/g;
alert(xxx.match(yyy).length);
Anpher
fuente
2
¡Obtienes un voto negativo imaginario por usar w3schools en lugar de MDN! developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
flaky
9

Por ejemplo:

let myString = "Hello World"
let myMatch = myString.match(/H.*/)
console.log(myMatch)

O

let myString = "Hello World"
let myVariable = "H"
let myReg = new RegExp(myVariable + ".*")
let myMatch = myString.match(myReg)
console.log(myMatch)
Driton Haxhiu
fuente
6

Ejemplo. Para encontrar el número de vocales dentro de la cadena

var word='Web Development Tutorial';
var vowels='[aeiou]'; 
var re = new RegExp(vowels, 'gi');
var arr = word.match(re);
document.write(arr.length);
Sarvar Nishonboev
fuente
0

para mí de todos modos, ayuda verlo usado. acabo de hacer esto usando el ejemplo "re":

var analyte_data = 'sample-'+sample_id;
var storage_keys = $.jStorage.index();
var re = new RegExp( analyte_data,'g');  
for(i=0;i<storage_keys.length;i++) { 
    if(storage_keys[i].match(re)) {
        console.log(storage_keys[i]);
        var partnum = storage_keys[i].split('-')[2];
    }
}
geekbuntu
fuente
-4
xxx.match(yyy, 'g').length
SilentGhost
fuente
5
Esto solo funcionará en Firefox y ni siquiera está documentado. La especificación establece que el String.prototype.matchmétodo solo espera un argumento . Usar el RegExpconstructor, como sugiere @Chris, es la forma preferida.
Christian C. Salvadó