1

我正在尝试使用此表达式解析 CSS 文件:

rulePatt = new RegExp("(?<=\\s)(?<!\\:\\s)#.*?\\{.*?\\}","gm");

它适用于我使用的两个不同的正则表达式测试器,但是当我把它放在野外时,它会产生 javascript 错误:

Uncaught SyntaxError: Invalid regular expression: /(?<=\s)(?<!\:\s)#.*?\{.*?\}/: Invalid group

在这里摆弄一下我想要达到的效果:http: //jsfiddle.net/LoomyBear/44XtU/1/

我想我在这里错过了一些非常重要的东西。请帮助...谢谢!

4

2 回答 2

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

第一个向后看(?<=\s)在锐利之前强加了一个空白,这就是我之前写一个 \s 的原因。第二个lookbehind(?<!:\s)禁止:在这个空格之前出现a,因此,在这个位置只允许没有任何内容(即:行首)或不是a的字符:

于 2013-07-12T15:48:22.953 回答
1

您可以通过使用内存组来模仿 JavaScript 中的look-behinds,例如:

var patt1 = /(?:\}|$)\s*(#[^\{]+)/g,
    m;

while ((m = patt1.exec(parseStr)) !== null) {
    output += m[1] + '<br>';
}

演示

首先,您匹配主题的开头或前一个定义的右大括号,然后是可选的空格。其余的或多或少是您的原始表达。

要遍历每个匹配项,您必须使用RegExp.exec()而不是,$.each()以便您可以选择要添加到的内存组output

于 2013-07-12T15:59:59.473 回答