Dans ce jsfiddle, j'ai une expression régulière qui devrait renvoyer des fonctions d'une chaîne.

var regex = /(\w+\s*\([^)]*\))/g
var array = regex.exec("func1 (1, 2) + func2 (3, 4)");
console.log(array)

La variable array doit contenir deux éléments func1 (1, 2) et func2 (3, 4), à la place, elle renvoie la chaîne entière. Quel est le problème avec cette expression régulière?

0
ps0604 8 mars 2016 à 07:48

4 réponses

Meilleure réponse

RegExp#exec renvoie un match unique à la fois. Pour utiliser exec pour obtenir toutes les correspondances, il doit être utilisé avec la boucle while.

var str = "func1 (1, 2) + func2 (3, 4)";
var regex = /(\w+\s*\(.*?\))/g;

while (match = regex.exec(str)) {
    console.log(match[1]);
}

String#match peut également être utilisé pour obtenir toutes les correspondances dans une seule instruction.

console.log("func1 (1, 2) + func2 (3, 4)".match(/(\w+\s*\(.*?\))/g));

Démo

console.log("func1 (1, 2) + func2 (3, 4)".match(/(\w+\s*\(.*?\))/g));
0
Tushar 8 mars 2016 à 05:05

Utilisez match here not exec:

"func1 (1, 2) + func2 (3, 4)".match(/(\w+\s*\(.*?\))/g);

Exec est destiné à être utilisé dans une boucle, car il récupérera toujours toutes les sous-expressions correspondantes. Dans votre code, vous n'obtiendrez que la première correspondance.

JSBin fonctionnel: https://jsbin.com/raquku/edit?js,console

0
omarjmh 8 mars 2016 à 05:03

Essaye ça

var re = /(\w+\s*\([^)]+\))/g; 
var str = 'func1 (1, 2) + func2 (3, 4)';
var m;

while ((m = re.exec(str)) !== null) {
    if (m.index === re.lastIndex) {
        re.lastIndex++;
    }
    alert(m[0])
    // View your result using the m-variable.
    // eg m[0] etc.
}
0
Tim007 8 mars 2016 à 05:00

Avec quelques modifications dans le code généré avec Regex101.com,

var re = /(\w+\s*\([^)]*\))/g; 
var str = 'func2 (3, 4) + func1 (1, 2)';
var m;
var results = [];
var counter = 0;
while ((m = re.exec(str)) !== null) {
    if (m.index === re.lastIndex) {
        re.lastIndex++;
    }
    results[counter] = m[counter]
    counter++;
}
console.log(results)
0
Pramod Karandikar 8 mars 2016 à 05:04