RegEx匹配括号之间的东西

时间:2011-06-01 22:13:41

标签: javascript regex arrays url url-routing

我很难让这个工作。我有一个字符串:

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

我需要正则表达式或一种方法来获取括号之间的每个匹配并返回匹配数组,如:

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

我正在使用的正则表达式是/\((.+)\)/,它似乎与正确的东西匹配如果只有一个括号。

如何使用JavaScript中的任何RegExp方法获取上面的数组?我只需返回该数组,因为数组中的返回项将循环通过以创建URL路由方案。

4 个答案:

答案 0 :(得分:88)

你需要通过添加'?'来使你的正则表达式'非贪婪'在'。+'之后

默认情况下,'*'和'+'是贪婪的,因为它们会匹配尽可能长的字符串,忽略字符串中可能出现的任何匹配。

非贪婪使得模式只匹配最短的匹配。

有关更好的解释,请参阅Watch Out for The Greediness!

或者,将正则表达式更改为

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

将匹配任何不包含parens的parens组合。

答案 1 :(得分:5)

使用此表达式:

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

e.g:

function()
{
    var mts = "something/([0-9])/([a-z])".match(/\(([^()]+)\)/g );
    alert(mts[0]);
    alert(mts[1]);
}

答案 2 :(得分: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]"]

答案 3 :(得分:3)

如果s是你的字符串:

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