Javascript 防止正则表达式吃掉字符串的某些部分

Javascript 防止正则表达式吃掉字符串的某些部分,javascript,regex,Javascript,Regex,一些背景信息:我正在编写一个程序,它允许人们使用CSS选择器分析文档的DOM树。我不能使用querySelectorAll,因为我需要支持较旧的浏览器,即使是在最新的浏览器中,它也往往有缺陷,而且不够强大。这意味着我必须编写自己的CSS选择器引擎/解析器 我有下面的正则表达式 var expression = /([^(>\+~)\\\(\)|^(>\+~)\\\[\]]+|\([^\)]+\)|\[[^\]]+\]|\\\.)+/g; 它用于按以下格式将选择器划分为多个部分:[祖

一些背景信息:我正在编写一个程序,它允许人们使用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'];

所以问题是我不知道如何防止表达式吃掉组合子。有什么建议吗?提前谢谢。

不要试图用正则表达式解析CSS,它不是一种正则语言。有一些工具可以实现这一点,而regex不是其中之一[^(>\+~)\\\\\\(\)\\\\\[\]例如,匹配一个不属于集合的字符
()[]>+~\\\\\\
。我必须承认,在正则表达式方面,我不是专家。我现在使用的表达式实际上是一个完全不同的表达式的修改版本,但由于它几乎可以工作,我希望通过一些小的更改,它能起作用。原始表达式与我现在使用的表达式几乎相同。开头用于匹配未在方框内显示的逗号。在这种情况下,情况几乎相同,excpet逗号替换为这些组合符。在方块内部,这些组合符在CSS中的含义会非常不同。