wake-up-neo.com

RegEx, um Inhalte in Klammern abzugleichen

Es fällt mir schwer, das zum Laufen zu bringen. Ich habe eine Zeichenfolge wie:

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

Und ich brauche Regex oder eine Methode, um jede Übereinstimmung in Klammern zu setzen und eine Reihe von Übereinstimmungen zurückzugeben, wie:

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

Der Regex, den ich verwende, ist /\((.+)\)/, was anscheinend zum richtigen passt if es gibt nur one Klammern.

Wie kann ich mit einer beliebigen RegExp-Methode in JavaScript ein Array wie oben erstellen? Ich muss nur dieses Array zurückgeben, da die zurückgegebenen Elemente im Array durchlaufen werden, um ein URL-Routing-Schema zu erstellen.

41
Oscar Godson

Sie müssen Ihr Regex-Muster "nicht gierig" machen, indem Sie ein "?" nach dem '. +'

Standardmäßig sind '*' und '+' dahingehend gierig, dass sie so lange wie möglich mit einer Zeichenfolge übereinstimmen, wobei Übereinstimmungen ignoriert werden, die innerhalb der Zeichenfolge auftreten können.

Nicht gierig bewirkt, dass das Muster nur mit der kürzestmöglichen Übereinstimmung übereinstimmt.

Siehe Achten Sie auf die Gier! für eine bessere Erklärung.

Oder ändern Sie alternativ Ihren regulären Ausdruck in

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

das passt zu jeder Gruppe von Eltern, die selbst keine Eltern enthalten.

93
Rob Raisch

Verwenden Sie diesen Ausdruck:

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

z.B:

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

Wenn s Ihre Zeichenfolge ist:

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