正则表达式:3或其他后面的“?”

时间:2018-07-30 18:09:22

标签: regex

我正在尝试仅使用以下5种匹配项:

https://www.website\.com((\/compare)|(\/home-tips)|(?!(/[^?].)))

  1. https://www.website.com
  2. https://www.website.com/compare
  3. https://www.website.com/home-tips
  4. https://www.website.com?anythinghere
  5. https://www.website.com/?anythinghere

我似乎无法弄清楚为什么我仍然与https://www.website.com/a或末尾的任何其他字母(例如https://www.website.com/b)匹配

有什么想法吗?

3 个答案:

答案 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)|(?:\/?\?.+)?)