我整天都在这,我无法理解。
下面是一个示例数据集,我试图匹配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')
因此,在我的程序中,我想解析背景的每个组件,然后用它做一些事情。我希望这有助于澄清为什么我要做这样的事情!
答案 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\(([^()]*|\([^()]*\))*\)
它将匹配一级嵌套括号。
答案 2 :(得分:0)