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)?$
正则表达式详细信息:
^
: 开始
(?!(?:.+?%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)?$
这使用否定前瞻来匹配 %20
,然后是任意数量的 %20
,所有这些都匹配两次。然后以任何不是 %20
的内容结束,除非最后可能有 %20。
注意:您的示例不匹配不包括 小于 3 的网址,例如
我想用正则表达式匹配来自 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)?$
正则表达式详细信息:
^
: 开始(?!(?:.+?%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)?$
这使用否定前瞻来匹配 %20
,然后是任意数量的 %20
,所有这些都匹配两次。然后以任何不是 %20
的内容结束,除非最后可能有 %20。
注意:您的示例不匹配不包括 小于 3 的网址,例如