一些背景信息: 我正在编写一个程序,它允许使用 CSS 选择器分析文档的 DOM 树。我不能使用 querySelectorAll,因为我需要支持较旧的浏览器,即使在最新的浏览器中它也往往有问题,而且它还不够强大。这意味着我必须编写自己的 CSS 选择器引擎/解析器。
我有以下正则表达式。
var expression = /([^(>\+~)\\\(\)|^(>\+~)\\\[\]]+|\([^\)]+\)|\[[^\]]+\]|\\\.)+/g;
它用于将选择器划分为以下格式的部分:[祖先,组合器,后代]。示例用法:
var selector = 'div[class]>a~p';
var parts = selector.match(expression);
不幸的是,我得到的输出是这样的:
// parts: ['div[class]', 'a', 'p'];
我希望输出是这样的:
// parts: ['div[class]', '>', 'a', '~', 'p'];
所以问题是我不知道如何防止表达式吃掉组合子。有什么建议吗?先感谢您。