复杂的正则表达式

时间:2011-05-19 16:11:00

标签: javascript regex

我正在尝试找到一个正则表达式,它将执行以下操作(在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。

  

我应该如何解决上述正则表达式?

4 个答案:

答案 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;