【问题标题】:How to exclude words from match in regex?如何从正则表达式的匹配中排除单词?
【发布时间】:2020-09-16 03:32:25
【问题描述】:

我正在尝试从匹配中排除某些 URL,其中包含 /com/de/cms/ 例如:

匹配这个:

www.example.com/catname/all-from-category/?pageNumber=1

但不是这个:

example.com/com/de/cms/catname/all-from-category/?pageNumber=3

正则表达式:

^[^com\/de\/cms\/]+\/all-from-category\/\?pageNumber=\d(&hitsPerPage=\d)?

https://regex101.com/r/Mqpspq/1

如何在匹配另一个 URL 的同时排除带有 com/de/cms/ 的 URL?

【问题讨论】:

  • 您的正则表达式可能缺少"catname" ?
  • 我认为“+”表示除之前定义的字符串之外的所有内容。其中将包括“猫名”。这是错的吗?
  • + 表示出现一次或多次之前的情况。
  • 你需要negative lookahead (?!.*\/com\/de/cms\/) 在行首锚之后,但是你的正则表达式还有其他问题。一方面,因为(&hitsPerPage=\d)? 在正则表达式的末尾并且是可选的,所以它没有效果。
  • @CarySwoveland 谢谢!这似乎有效: "^(?!.*\/com\/de/cms\/).*\/all-from-category\/\?pageNumber=\d(&hitsPerPage=\d)?$"

标签: regex


【解决方案1】:

您的正则表达式中有几个错误。

  1. 第一个^ 匹配开头的start,如果启用了多行模式,则匹配一行的开头。

  2. [^com\/de\/cms] 部分表示匹配除com/ 或等之外的任何字符。但你的意图是匹配除 com/de/cms 之外的任何 子字符串 作为一个整体。您可以使用 negative lookbehind 来完成您想要的操作,如下所示:(?<!com\/de\/cms\/)

  3. 您缺少catname 部分。

一个有效的正则表达式是:

(?<!com\/de\/cms)\/catname\/all-from-category\/\?pageNumber=\d

前面的正则表达式简单地说如下:

请匹配/catname/all-from-category/?pageNumber=SOME_DIGIT,即前面有com/de/cms

Regexr.

【讨论】:

  • 我的意图也是匹配“/all-from-category”之前的任何字符串,但定义的单词除外。这将包括“catname”,因为这只是任何类别名称的占位符。如果我用 .* 替换正则表达式中的猫名,它将再次匹配意外的行。
  • 对我来说,如果我将 catname 替换为 [^/]+,它会起作用。
  • Yousef,问题是包含 com/de/cms 的 URL 将被排除在外,没有限定它们出现在字符串中的位置。因此,您需要消极的前瞻,而不是消极的后瞻。请参阅我对这个问题的评论。
  • @CarySwoveland 感谢您的 cmets,他们是正确的。但是,似乎 OP 知道 com/de/cms 将在 URL 中的位置。据我了解,com/de/cms 后面总是跟一个类别名称,然后是/all-from-category/....etc。对于猫名部分,如果他应用了duckboycool的建议使用[^\/]+,它将完美地工作,因为类别名称永远不会包含/
猜你喜欢
  • 1970-01-01
  • 2016-12-15
  • 2016-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多