正则表达式匹配括号之间的内容
Posted
技术标签:
【中文标题】正则表达式匹配括号之间的内容【英文标题】:RegEx to match stuff between parentheses 【发布时间】:2011-09-06 16:38:00 【问题描述】:我很难让它发挥作用。我有一个像这样的字符串:
something/([0-9])/([a-z])
我需要正则表达式或获取括号之间的每个匹配项并返回匹配数组的方法,例如:
[
[0-9],
[a-z]
]
我使用的正则表达式是/\((.+)\)/
,它似乎确实匹配正确的东西如果只有一个括号集。
如何使用 javascript 中的任何 RegExp 方法获得类似上述的数组?我只需要返回该数组,因为数组中的 返回 项将被循环以创建 URL 路由方案。
【问题讨论】:
当您说“一组括号”时,您指的是嵌套括号吗?理解整个“平衡括号”的东西基本上超出了正则表达式的能力。 Anything 在()
内。所以如果字符串是something/([0-9])/((a)(b))
,它会返回[ [0-9], (a)(b) ]
。我不打算验证这些,只是把它们扔进new RegExp()
【参考方案1】:
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]"]
【讨论】:
【参考方案2】:如果 s 是你的字符串:
s.replace(/^[^(]*\(/, "") // trim everything before first parenthesis
.replace(/\)[^(]*$/, "") // trim everything after last parenthesis
.split(/\)[^(]*\(/); // split between parenthesis
【讨论】:
【参考方案3】:使用这个表达式:
/\(([^()]+)\)/g
例如:
function()
var mts = "something/([0-9])/([a-z])".match(/\(([^()]+)\)/g );
alert(mts[0]);
alert(mts[1]);
【讨论】:
【参考方案4】:您需要通过添加“?”使您的正则表达式模式“非贪婪”在'.+'之后
默认情况下,'*' 和 '+' 是贪婪的,因为它们会匹配尽可能长的字符串,忽略字符串中可能出现的任何匹配。
非贪婪使得模式只匹配最短的匹配。
请参阅Watch Out for The Greediness! 以获得更好的解释。
或者,将您的正则表达式更改为
\(([^\)]+)\)
这将匹配任何本身不包含括号的括号分组。
【讨论】:
完美,匹配!但我坚持如何从中获得一个数组?我刚得到["([0-9])"]
和str.match(/\([^\)]+\)/g)
:(
您缺少内部开始和结束捕获括号。尝试 /\(([^)]+)\)/g 它将捕获所有可能的括号值。注意 \( 和 \) 之前的 second 对括号。
感谢“贪婪”部分。帮了大忙。
在我的情况下,要包含不包含任何其他括号的括号,我必须在正则表达式中添加开放括号:\(([^\)(]+)\)
这很好,但有没有办法不匹配实际的括号本身?我总是可以删除每场比赛的第一个和最后一个字符,但如果可以在一行中完成就更好了。以上是关于正则表达式匹配括号之间的内容的主要内容,如果未能解决你的问题,请参考以下文章