我正在尝试仅使用以下5种匹配项:
https://www.website\.com((\/compare)|(\/home-tips)|(?!(/[^?].)))
我似乎无法弄清楚为什么我仍然与https://www.website.com/a或末尾的任何其他字母(例如https://www.website.com/b)匹配
有什么想法吗?
答案 0 :(得分:1)
您不匹配最后2个字符,因为您使用了不消耗任何字符的负前行(?!(/[^?].))
。
您可以替换匹配可选的正斜杠/?
的女巫,然后匹配问号\?
并匹配任何字符零次或多次.*
。
要同时匹配第一个,请将整个外部组设为可选,如果您没有在代码中使用或引用它们,则可以忽略(\/compare)
和(\/home-tips)
的分组。
您的正则表达式可能如下:
^https://www.website\.com(?:/(?:compare|home-tips)|/?\?.*)?$
那将匹配:
^https://www.website\.com
从字符串https://www.website.com
的开头开始匹配(?:
非捕获组
/
字面上匹配(?:
非捕获组
compare
字面上匹配|
或home-tips
字面上匹配)
关闭非捕获组|
或/?\?.*
匹配一个可选的正斜杠,一个问号,后跟任意字符零次或多次)?
关闭非捕获组并将其设置为可选$
声明字符串的结尾答案 1 :(得分:0)
您需要将^
放在模式的开头,并将$
放在模式的末尾,以将表达式的两端锚定到字符串的两端。否则,任何部分匹配都将返回成功(即匹配这些字符串的https://www.website.com
部分)。
答案 2 :(得分:0)
您没有与当前正则表达式匹配的内容,只需确保将其转义...请参见https://regexr.com/
但是,我建议使用类似https:\/\/www.website\.com(?:\/(.*))?(?:\?.*)
的东西,并在不同的路径上使用switch进行匹配,以使您的正则表达式永远不会增长...此正则表达式为您提供路径和查询。
上一个答案:
您可以为此简单地使用不匹配的组...
https:\/\/www.website\.com((?:\/compare)|(?:\/home-tips)|(?:\/?\?.+)?)