2011-06-01 10 views
31

J'ai du mal à faire fonctionner ça. J'ai une chaîne comme:RegEx pour faire correspondre des choses entre parenthèses

something/([0-9])/([a-z]) 

Et j'ai besoin regex ou une méthode pour obtenir de chaque match entre les parenthèses et retourne un tableau de correspondances comme:

[ 
    [0-9], 
    [a-z] 
] 

Le regex J'utilise est /\((.+)\)/ qui semble correspondre à la bonne chose si il n'y a que un ensemble de parenthèses.

Comment puis-je obtenir un tableau comme ci-dessus en utilisant une méthode RegExp en JavaScript? Je dois retourner juste ce tableau parce que les éléments retournés dans le tableau seront bouclés pour créer un schéma de routage d'URL.

+1

Quand vous dites "un ensemble de parenthèses", sont vous parlez de * parenthèses * imbriquées? C'est fondamentalement au-delà du pouvoir des expressions régulières de comprendre l'ensemble des «parenthèses équilibrées». – Pointy

+0

_Tout à l'intérieur de '()'. Donc, si la chaîne était 'quelque chose/([0-9])/((a) (b))' cela retournerait [[0-9], (a) (b)] '. Je ne vais pas les valider, juste en les jetant dans un 'nouveau RegExp()' –

Répondre

71

Vous devez rendre votre motif regex 'non gourmand' en ajoutant un '?' Après le '. +'

Par défaut, '*' et '+' sont gourmands en ce qu'ils correspondent à une chaîne de caractères aussi longue que possible, en ignorant les correspondances qui pourraient apparaître dans la chaîne.

Non gourmand, le motif correspond uniquement à la correspondance la plus courte possible.

Voir Watch Out for The Greediness! pour une meilleure explication.

Ou alternativement, modifiez votre regex à

\(([^\)]+)\) 

qui correspond à tout groupement de parens qui ne sont pas, eux-mêmes, contiennent parens.

+0

Parfait, ça correspond! mais je suis bloqué à comment faire un tableau de cela? Je viens d'obtenir '[" ([0-9]) "]' avec 'str.match (/ \ ([^ \)] + \)/g)' :( –

+2

Il vous manque la capture interne de début et de fin Essayez/\\ (([^)] +) \\)/g qui capturera toutes les valeurs entre parenthèses possibles. Notez la * deuxième * paire de parens après \\ (et avant \\). –

+0

Parfait merci! –

4

Utilisez cette expression:

/\(([^()]+)\)/g 

par exemple:

function() 
{ 
    var mts = "something/([0-9])/([a-z])".match(/\(([^()]+)\)/g); 
    alert(mts[0]); 
    alert(mts[1]); 
} 
3
var getMatchingGroups = function(s) { 
    var r=/\((.*?)\)/g, a=[], m; 
    while (m = r.exec(s)) { 
    a.push(m[1]); 
    } 
    return a; 
}; 

getMatchingGroups("something/([0-9])/([a-z])"); // => ["[0-9]", "[a-z]"] 
2

Si s est votre chaîne:

s.replace(/^[^(]*\(/, "") // trim everything before first parenthesis 
.replace(/\)[^(]*$/, "") // trim everything after last parenthesis 
.split(/\)[^(]*\(/);  // split between parenthesis 
Questions connexes