【问题标题】:How to write regex that does not match on a substring and ends in a string?如何编写与子字符串不匹配并以字符串结尾的正则表达式?
【发布时间】:2020-06-09 22:03:28
【问题描述】:

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

到目前为止,我想出了:

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

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

globalsite/xeditor/styles.css

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

我该怎么做?

【问题讨论】:

  • ^(?!.*xeditor).*\.css$
  • @WiktorStribiżew 不是 ^ 唯一的测试以开头吗?
  • 这是你需要的,在开始时锚定前瞻检查。
  • @WiktorStribiżew 效果很好!它不是一个答案,所以我不能这样标记它
  • 卷。 1,如果还没有说清楚,(?!.*xeditor) 使正则表达式引擎从字符串的开头向前移动,一次一个字符,直到满足负前瞻,这在globalsite/xeditor/styles.css 中是当内部正则表达式字符串指针在'x''e' 之间。然后尝试从该位置开始匹配.*css?$。在开头添加锚点 ^ 将断言固定到字符串的开头,导致负前瞻,从而导致正则表达式失败。另请注意,css? 仅将最后一个 's' 设为可选。

标签: regex webpack regex-negation


【解决方案1】:

要匹配以特定模式结尾但不包含其他模式的字符串,您可以使用类似的正则表达式

^(?!.*pattern1).*pattern2$

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

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

在这里,你可以使用

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

请参阅regex demo

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

详情

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-17
    • 2015-08-01
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多