REGEX - 如何精确匹配 url 中的 3 个单词?

REGEX - how to match exacly 3 words from url?

我想用正则表达式匹配来自 url 的搜索短语中的 3 个单词,但不匹配 4 个或更多。 URL 可以有一些变化。问题如下图所示。正则表达式应匹配和不匹配以下示例:

SHOULD MATCH:
https://example.com/search=any%20url%20encoded_word-here
https://example.com/search=any%20url%20encoded_word-here%20
https://example.com/search=z%C5%82oty%20z%C5%82oty%20z%C5%82oty
https://example.com/search=z%C5%82oty%20z%C5%82ota%20%C5%82ata
https://example.com/search=any%20%20word%20%20here
https://example.com/search=any%20word%20here&color=blue
https://example.com/search=any-1st%20word_2nd%20here3

SHOULD NOT MATCH:
https://example.com/search=one%20two%20three%20four
https://example.com/search=one%20%20two%20%20three%20%20four
https://example.com/search=one%20%20two%20three%20%20four
https://example.com/search=one%20%20two%20%20three%20%20four
https://example.com/search=one%20two%20three%20four&color=blue
https://example.com/search=z%C5%82oty%20z%C5%82oty%20z%C5%82oty%20word

从这里开始 https://regex101.com/r/0qzCJV/1 但我不知道如何不匹配条件。你们能帮帮我吗?

当有 3 个 %20 后跟至少 1 个字符时,您可以使用这个带有否定前瞻的正则表达式来使匹配失败:

^(?!(?:.+?%20){3}.)(?:.+?%20){2}.+?(?:%20)?$

RegEx Demo

正则表达式详细信息:

  • ^: 开始
  • (?!(?:.+?%20){3}.):当我们有 3 次 %20 后跟至少 1 个字符
  • 时,否定前瞻使匹配失败
  • (?:.+?%20){2}:匹配 1+ 个后跟 %20 的任意字符。重复此匹配 2 次以匹配 2 个单词
  • .+?: 匹配1+个任意字符
  • (?:%20)?:匹配可选的%20 before end
  • $:结束

或者使用所有格量词来减少回溯:

^(?!(?:.+?%20){3}+.)(?:.+?%20){2}.+?(?:%20)?$

试试这个:

^(((?!%20).)*(%20)+){2}((?!%20).)*(%20)?$

live demo

这使用否定前瞻来匹配 %20,然后是任意数量的 %20,所有这些都匹配两次。然后以任何不是 %20 的内容结束,除非最后可能有 %20。


注意:您的示例不匹配不包括 小于 3 的网址,例如

https://example.com/search=one%20two