2011-06-01 101 views
31

我正在艰难地工作。我有这样的字符串:正则表达式用于匹配括号之间的内容

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

我需要正则表达式或获取括号之间的每场比赛的方法和像返回匹配的数组:

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

我使用的正则表达式是/\((.+)\)/这看起来确实匹配如果只有一套括号。

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

+1

当你说 “一组括号”,是你指的是*嵌套*括号?它基本上超越了正则表达式的力量来理解整个“平衡括号”的东西。在'()'里面的_Anything_( – Pointy 2011-06-01 22:15:45

+0

)。所以如果字符串是'something /([0-9])/((a)(b))',它会返回'[[0-9],(a)(b)]'。我不会去验证这些,只是把它扔进一个新的RegExp()' – 2011-06-01 22:20:43

回答

71

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

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

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

请参阅Watch Out for The Greediness!以获得更好的解释。

或者交替,你的正则表达式改为

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

将匹配不,本身,包含括号括号中的任意分组。

+0

完美,它匹配它!但我坚持如何从中得到一个数组?我只是用'str.match(/ \([^ \)] + \)/ g)得到'[“([0-9])”]':( – 2011-06-01 22:27:09

+2

你错过了内部的开始和结束捕捉尝试/ \\(([^)] +)\\)/ g,它将捕获所有可能的括号内的值。注意\\之后的第二对parens(和\\之前)。 – 2011-06-01 22:29:29

+0

完美的谢谢! – 2011-06-01 22:34:48

4

使用该表达式:

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

如:

function() 
{ 
    var mts = "something/([0-9])/([a-z])".match(/\(([^()]+)\)/g); 
    alert(mts[0]); 
    alert(mts[1]); 
} 
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]"] 
2

如果s是你的字符串:

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