web-dev-qa-db-fra.com

RegEx pour faire correspondre les éléments entre parenthèses

J'ai du mal à faire fonctionner cela. J'ai une chaîne comme:

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

Et j'ai besoin d'une expression régulière ou d'une méthode pour obtenir chaque correspondance entre les parenthèses et retourner un tableau de correspondances comme:

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

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

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

41
Oscar Godson

Vous devez rendre votre modèle d'expression régulière "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, ignorant toutes les correspondances qui pourraient se produire dans la chaîne.

Non gourmand, le motif ne correspond qu'à la correspondance la plus courte possible.

Voir Attention à la gourmandise! pour une meilleure explication.

Ou bien, changez votre regex en

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

qui correspondra à tout groupe de parens qui ne contient pas eux-mêmes de parens.

93
Rob Raisch

Utilisez cette expression:

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

par exemple:

function()
{
    var mts = "something/([0-9])/([a-z])".match(/\(([^()]+)\)/g );
    alert(mts[0]);
    alert(mts[1]);
}
6
Chandu
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]"]
4
maerics

Si s est votre chaîne:

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