0

我整天都在这,我想不通。

下面是一个示例数据集,我试图匹配每一个出现的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')

因此,在我的程序中,我想解析出背景的每个组件,然后对其进行处理。我希望这有助于澄清为什么我想做这样的事情!

4

3 回答 3

3

我知道这并不能直接回答您的问题,但是如果您想要使用除非常有限的 JavaScript 子集之外的任何内容,您确实应该考虑查看合适的 JavaScript 解析器。正如您所发现的,只要您想做任何对远程有用的事情,正则表达式就变得完全不切实际。

一个不错的选择是esprima。它是可靠的、有据可查的,并且非常适合其他工具,因为它使用标准格式来显示结果。

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

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);
};

所以,是的,您可能应该考虑使用真正的解析器,而不是试图拼凑脆弱的正则表达式来做到这一点。

于 2013-06-27T02:14:03.537 回答
2

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

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

它将匹配一级嵌套括号。

请参阅此处的正则表达式演示

在此处查看 JavaScript 使用演示

于 2013-06-27T01:38:58.343 回答
0

这是另一种方法:

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

JSFiddle

于 2013-06-27T01:59:41.823 回答