我正在尝试使用以下表达式解析CSS文件:
rulePatt = new RegExp("(?<=\\s)(?<!\\:\\s)#.*?\\{.*?\\}","gm");
它适用于我使用的两个不同的正则表达式测试程序,但是当我把它放在野外它会生成javascript错误:
Uncaught SyntaxError: Invalid regular expression: /(?<=\s)(?<!\:\s)#.*?\{.*?\}/: Invalid group
在这里弄清楚我正在努力实现的目标:http://jsfiddle.net/LoomyBear/44XtU/1/
我想我想念一些非常重要的东西。 请帮忙 ... 谢谢!
答案 0 :(得分:1)
您可以使用此模式
var regex = /(?:^|[^:])\s(#[^{]*\{[^}]*\})/gm;
您的结果位于第一个捕获组中。
说明:
(?:^|[^:]) # begining of the line or a character that is not a :
\s # a white space
(#
[^{]* # all characters expect { zero or more times
\{
[^}]* # all characters expect } zero or more times
\})
第一个lookbehind (?<=\s)
在锐利之前强加了一个空格,这就是为什么我之前写了一个\ s的原因。
第二个lookbehind (?<!:\s)
在此空格之前禁止:
,因此,在此位置不允许任何内容(即:行的开头)或不是:
<的字符/ p>
答案 1 :(得分:1)
您可以使用内存组来模仿JavaScript中的后视,例如:
var patt1 = /(?:\}|$)\s*(#[^\{]+)/g,
m;
while ((m = patt1.exec(parseStr)) !== null) {
output += m[1] + '<br>';
}
首先匹配主题的开头或前一个定义的右括号,然后是可选的空格。其余的或多或少是你的原始表达。
要迭代每个匹配,您必须使用RegExp.exec()
而不是$.each()
,以便您可以选择要添加到output
的内存组。