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

IT技术 javascript regex arrays url url-routing
2021-02-17 04:20:57

我很难让它发挥作用。我有一个像这样的字符串:

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

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

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

如果只有组括号,我正在使用的正则表达式/\((.+)\)/似乎确实匹配正确的东西

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

4个回答

您需要通过添加 '?' 使您的正则表达式模式“非贪婪”。在“.+”之后

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

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

看到小心贪婪!为了更好的解释。

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

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

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

您缺少内部开始和结束捕获括号。尝试 /\(([^)]+)\)/g 它将捕获所有可能的括号值。注意\( 和 \ 之前第二对括号。
2021-04-20 04:20:57
这很好,但是有没有办法不匹配实际的括号本身?我总是可以删除每个匹配项的第一个和最后一个字符,但如果可以在一行中完成就太好了。
2021-04-29 04:20:57
完美,匹配!但我坚持如何从中获得一个数组?我刚刚得到["([0-9])"]str.match(/\([^\)]+\)/g):(
2021-05-02 04:20:57
感谢“贪婪”部分。帮助了很多。
2021-05-02 04:20:57
在我的情况下,要包含不包含任何其他括号的括号,我必须向正则表达式添加开放括号: \(([^\)(]+)\)
2021-05-16 04:20:57

使用这个表达式:

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

例如:

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

如果 s 是您的字符串:

s.replace(/^[^(]*\(/, "") // trim everything before first parenthesis
 .replace(/\)[^(]*$/, "") // trim everything after last parenthesis
 .split(/\)[^(]*\(/);      // split between parenthesis
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]"]