我正在尝试找到一个正则表达式,它将执行以下操作(在Javascript中工作)。我想在括号内包含一些包含(token)
等标记的字符串。我的目标是捕获令牌(包括括号)。我将假设括号不是嵌套的,并且每个左括号最终都会关闭。
我将使用的正则表达式是
[[^\(\)]*|(\(.*?\))]*
让我分解一下:
[ # Either of two things:
[^\(\)]* # the first is a substring not containing parentheses
|
( # the second is to be captured...
\(.*?\) # and should contain anything in parentheses - lazy match
)
]* # Any number of these blocks can appear
毋庸置疑,这不起作用(为什么我会在这里问其他?):
var a = /[[^\(\)]*|(\(.*?\))]*/;
a.exec('foo(bar)');
Firefox和Node都失败了。我以前的尝试是一个稍微复杂的正则表达式:
(?:[^\(\)]*(\(.*?\)))*[^\(\)]*
可以描述如下
(?: # A non-capturing group...
[^\(\)]* # ...containing any number of non-parentheses chars
(\(.*?\)) # ...followed by a captured token inside parentheses.
)* # There can be any number of such groups
[^\(\)]* # Finally, any number of non-parentheses, as above
这适用于foo(bar)
,但会在foo(bar)(quux)
上失败,仅限于使用quux。
我应该如何解决上述正则表达式?
答案 0 :(得分:4)
正则表达式中不能有任意数量的捕获组。使用/ g标志来完成此任务:s.match(/\([^\)]+\)/g)
答案 1 :(得分:2)
这可以在Chrome中找到 - 测试
<your string here>.match(/(\(.*?\))/g)
它返回一个匹配数组:
str = 'Content(cap)(cap2)(cap3)'
str.match(/(\(.*?\))/g)
-> ["(cap)", "(cap2)", "(cap3)"]
答案 2 :(得分:1)
如果您的目标是捕获括号内的标记(包括分隔符),那么可以使用简单的正则表达式:
\([^)]*?\)
会奏效。
答案 3 :(得分:1)
var a= /\([^)]+\)/g;