JavaScript - Utiliser une variable dans la correspondance de chaîne


90

J'ai trouvé plusieurs questions similaires, mais cela ne m'a pas aidé. J'ai donc ce problème:

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

Je ne sais pas comment passer la variable dans la commande match. Veuillez aider. Merci.



Une dernière chose: si vous utilisez une variable pour construire une expression rationnelle, il faut veiller à ce que la variable puisse contenir des caractères spéciaux d'expression régulière. par exemple si vous passez "c ++", le compilateur regex se plaindraSyntaxError: Invalid regular expression: /c++/: Nothing to repeat
dotslashlu

Réponses:


188

Bien que la fonction de correspondance n'accepte pas les littéraux de chaîne comme modèles d'expression régulière, vous pouvez utiliser le constructeur de l'objet RegExp et le transmettre à la fonction String.match:

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

Tous les indicateurs dont vous avez besoin (tels que / g) peuvent entrer dans le deuxième paramètre.


2
+1, c'est la méthode préférée, BTW, si l'argument passé à la matchméthode n'est pas un RegExpobjet, en interne le RegExpconstructeur sera appelé en utilisant cette valeur, vous pouvez donc utiliser un modèle de chaîne , par exemple:"a123".match("\\d+")[0] === "123";
Christian C. Salvadó


9

Par exemple:

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

Ou

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

6

Exemple. Pour trouver le nombre de voyelles dans la chaîne

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

0

pour moi en tout cas, ça aide de le voir utilisé. vient de faire ceci en utilisant l'exemple "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];
    }
}

-4
xxx.match(yyy, 'g').length

5
Cela ne fonctionnera que dans Firefox, et ce n'est même pas documenté. La spécification indique que la String.prototype.matchméthode n'attend qu'un seul argument . Utiliser le RegExpconstructeur, comme @Chris le suggère, est la méthode préférée.
Christian C. Salvadó
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.