javascript - 为什么这个非捕获组会捕获?

标签 javascript regex css-selectors pattern-matching

应用此正则表达式模式:

/(?:(^| |\>|\+))+([a-z\-\_]+)/gi

到这个字符串:

body.test ol+li ol > li #foobar p>span a[href=*]

我得到这些匹配项,以逗号分隔:

body, ol,+li, ol, > li, p,>span, a

为什么有些匹配项有前导空格 >+ 符号?我希望我的正则表达式 (?:(^| |\>|\+)) 的这一部分能够匹配这些符号,但不会捕获它们。

编辑:我正在尝试匹配 html 标签和 css 选择器,以提高 css 选择器的 css 特异性。因此,我想单独匹配每个 lispan 等,而不使用 +>

最佳答案

捕获与匹配不同。由于您在模式中指定了组合器,因此匹配器将拾取它们,无论它们是捕获的还是未捕获的。

要捕获,您需要在字符串上 exec() 执行正则表达式并循环遍历结果,其中将包含您的捕获组。我还清理了您的模式并对其进行了修改,以便它不会进行不必要的捕获,并且会识别 the general sibling combinator ~ :

var sel = "body.test ol+li ol > li #foobar p>span a[href=*]";
var re = /(?:^| |>|\+|~)+([a-z_-]+)/gi;
var matches = [], m;

while (m = re.exec(sel)) {
    matches.push(m[1]);
}

然后您将获得预期的匹配项:

body, ol, li, ol, li, p, span, a

关于javascript - 为什么这个非捕获组会捕获?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14787652/

相关文章:

JavaScript 正则表达式模式 : Find the secret word

javascript - 您可以在 JavaScript 中检索多个正则表达式匹配项吗?

css - 选择某个父元素的多个子元素

javascript - Canvas drawImage() 不工作

javascript - 如何在不删除子表内容的情况下删除父表?

javascript - 在 Sequelize 中得到很多结果

ruby - 正则表达式:如何使用正则表达式(在 ruby​​ 中)从电子邮件中获取/提取信息?

Java 模式不返回最左边的匹配

html - 第 nth-child() 和 blockquote css

javascript - 如何使用 jQuery 选择第一个父 DIV?