匹配括号之间内容的正则表达式

71

我现在遇到了麻烦,我有一个字符串:

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

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

[
  [0-9],
  [a-z]
]
我正在使用的正则表达式是/\((.+)\)/,如果只有一个括号组,则似乎匹配正确

如何使用JavaScript中的任何RegExp方法获取类似上述的数组?我需要返回该数组,因为数组中的返回项将循环遍历以创建URL路由方案。

``` var regex = /\(([^)]+)\)/g; var str = "(foo) (bar) (baz)"; var result = []; var match; while (match = regex.exec(str)) { result.push(match[1]); }
console.log(result); // ["foo", "bar", "baz"] ```

2
当你说“一组括号”时,你是指嵌套的括号吗?基本上,正则表达式无法理解整个“平衡括号”问题。 - Pointy
1
()内的任何内容。因此,如果字符串是something/([0-9])/((a)(b)),它将返回[[0-9],(a)(b)]。我不会验证这些内容,只是将它们放在new RegExp()中。 - Oscar Godson
4个回答

154

你需要通过在 .+ 后添加一个 ? 来使你的正则表达式模式变为“非贪婪”的。

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

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

参见小心贪婪!以获取更好的解释。

或者,你可以将你的正则表达式修改为

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

这将匹配不包含括号的任何括号分组。


完美,这正是它!但我卡在如何从中创建一个数组上了?我只得到了 ["([0-9])"],使用的是 str.match(/\([^\)]+\)/g) :( - Oscar Godson
2
你缺少了内部的起始和结束捕获括号。尝试使用 /\(([^)]+)\)/g,它将捕获所有可能的带括号的值。请注意,在 \( 和 \) 之间的第二对括号。 - Rob Raisch
感谢"贪心"部分的帮助,帮了很多忙。 - Dmitri
2
在我的情况下,为了包括不包含任何其他括号的括号,我不得不将开放的括号添加到正则表达式中:      \(([^\)(]+)\) - Aryan Firouzian
最简单的方法是进行替换并获取结果,例如:result=str.replace(/^.+?\(([^\)]+)\).+$/,'$1'),它将用文本本身替换包含括号内文本范围的字符串。请参见https://jsfiddle.net/b3rs34d4/。 - Rob Raisch
显示剩余3条评论

16

使用这个表达式:

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

e.g:

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

6
如果 s 是你的字符串:
s.replace(/^[^(]*\(/, "") // trim everything before first parenthesis
 .replace(/\)[^(]*$/, "") // trim everything after last parenthesis
 .split(/\)[^(]*\(/);      // split between parenthesis

4
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]"]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接