使用Regex匹配包含括号的函数调用

时间:2013-06-27 01:29:00

标签: javascript regex

我整天都在这,我无法理解。

下面是一个示例数据集,我试图匹配foo的每个出现以及它在括号中的内容。

foo(a, b)
foo(a, (b))
foo((a), (b)), foo((c), (d))
foo((a), (b)), foo(c, d)

我能想出的最好的是foo\(.*\)?\),但这只是抓住每一行。

编辑:

我特别想要做的是从网页解析backgroundImage CSS样式并以某种方式处理它,我得到以下三个示例形式:

linear-gradient(to bottom right, red, white)
linear-gradient(to bottom right, red, rgba(255,0,0,0)), linear-gradient(to top left, red, blue)
linear-gradient(to bottom right, red, rgba(255,0,0,0)), url('http://example.com/image.jpg')

因此,在我的程序中,我想解析背景的每个组件,然后用它做一些事情。我希望这有助于澄清为什么我要做这样的事情!

3 个答案:

答案 0 :(得分:3)

我知道这并没有直接回答你的问题,但如果你想使用除非常有限的JavaScript子集以外的任何东西,你真的应该考虑寻找合适的JavaScript解析器。正如您所知,只要您想做任何远程有用的事情,正则表达式变得完全不切实际。

一个好的选择就像esprima。它结实,记录良好,与其他工具完全吻合,因为它使用a standard format来获得结果。

您还必须考虑范围界定的情况 - 所有foo都不相等!考虑以下情况:

var foo = function foo(a, b) {
  return a + b;
};

var bar = function bar(a, b, c) {
  return foo(a, b) * c;
};

var baz = function baz(a, b, c, d) {
  var foo = function foo(x, y) {
    return x - y;
  };

  return foo(bar(a, b, c), d);
};

所以是的,你应该考虑使用一个真正的解析器,而不是试图拼凑脆弱的正则表达式。

答案 1 :(得分:2)

要匹配示例中使用的CSS中的函数,请使用此正则表达式:

\blinear-gradient\(([^()]*|\([^()]*\))*\)

它将匹配一级嵌套括号。

See regex demo here

See JavaScript usage demo here

答案 2 :(得分:0)

这是另一种方法:

/\bfoo\(.+?\)(?=, foo|$)/g

JSFiddle