如果以某个字符开头,正则表达式不匹配?

5

我有这个正则表达式:

/(((\w+)|(\.\w+)|(\#\w+)|\*)(\[(.+(=".+"|\*".+"|\^".+"|))\])?(::|:)?)+(?=[ \S]*\{)/gm

我试图使用它来匹配CSS选择器。考虑这个伪代码 CSS 输入:

.main {
  property: value;
}

.one, .two a[href$=".com"] {
  .subclass {
    property: value;
  }
}

.test:before, .test:after:active {}

上述模式将返回以下匹配:

['.body', '.one', '.two', 'a[href$=".com"]', '.subclass', '.test:before', '.test:after:active']

我正在尝试修改模式以便不匹配伪选择器。因此,所有其他匹配仍应有效,但.test:before应仅匹配.test.test:after:active也应仅匹配.test。我无法想到一种方法来实现这一点,而不使用负回溯或者不匹配第一个字符是:的方式。
我是在Node中实现这个操作的,我不想将我的脚本锁定在Node > 9.2.0上,只是为了在正则表达式中使用负回溯。
非常感谢您提供任何想法!

@CAustin 只匹配类选择器。还有许多其他非伪选择器模式需要考虑。 - Patrick Roberts
你能提供一个更新的输入示例,其中包括你正在尝试匹配的其他内容吗? - CAustin
@CAustin 一个CSS模式是属性选择器,我已经将其添加到我的示例中。 - topherlicious
1
正则表达式在这种情况下最多只能是一个不太可靠的解决方案。我建议使用解析器,例如JSCSSP http://glazman.org/JSCSSP/。 - CAustin
1
作为建议,为什么不先使用您已有的正则表达式,然后再删除伪选择器呢?据我所知,CSS 仅有有限数量的伪类/元素。虽然这不仅仅是使用正则表达式,而且不会像一行代码那样漂亮,但仍可能更容易,而且不需要整个解析器或任何其他东西。 - zlmonroe
显示剩余3条评论
1个回答

1

(?!.*:)(?:[.#]\w+|\w+\[.*\])

你可以使用类似这样的东西吗?
这个使用负向先行断言来确保它不会捕获旁边有冒号的任何内容,同时使用了一个简化版的伪CSS元素匹配器。 在这里看它的工作原理

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接