如何编写在子字符串上不匹配并以字符串结尾的正则表达式?

How to write regex that does not match on a substring and ends in a string?

我想编写规则(在 Webpack 中使用)匹配不包含子字符串 xeditor 且以 .css 结尾的字符串。如果子字符串 xeditor 出现在字符串中的任何位置,则应将其丢弃(即不匹配)。

到目前为止我想出了:

(?!.*xeditor.).*css?$

我在 https://www.regextester.com/ 中进行了测试,但它仍然匹配这样的字符串:

globalsite/xeditor/styles.css

它表明 globalsite/x 之后的所有内容,即 editor/styles.css 是匹配项。因为它在字符串中包含 xeditor 我希望它的 none 匹配。

我该怎么做?

要匹配以特定模式结尾但不包含其他模式的字符串,您可以使用像

这样的正则表达式
^(?!.*pattern1).*pattern2$

否定先行模式必须在开始时锚定先行检查,否则,在字符串中的每个位置检查表达式,(?!.*pattern1)可能匹配一个不在开始的位置,在中间的某个地方,右边没有 pattern1,但它仍然可以在左边。

详细了解为什么 "Lookarounds (Usually) Want to be Anchored" at rexegg.com

在这里,您可以使用

^(?!.*xeditor).*\.css$

参见regex demo

请注意 . 必须进行转义才能被解析为文字点字符。

详情

  • ^ - 字符串的开头
  • (?!.*xeditor) - 如果除换行字符外还有 0+ 个字符,则匹配失败的否定前瞻,尽可能多,然后 xeditor
  • .* - 除换行字符外的 0+ 个字符,尽可能多
  • \.css$ - .css 字符串末尾的子字符串。