我正在尝试创建一个正则表达式,该正则表达式与查询字符串之前具有大写字母的URL匹配。我想捕获包含问号的查询字符串,并且想捕获非查询字符串部分。如果没有查询字符串,但是有一个大写字母,则应捕获非查询字符串部分。

一些例子:

/contextroot/page.html?param1=value1&param2=value2 NO MATCH
/contextroot/page.html?param=VALUE&param2=value2   NO MATCH

/contextroot/Page.html?param=value                 MATCH
/contextroot/Page.html                             GROUP 1
?param=value                                       GROUP 2

/contextroot/page.HTML                             MATCH
/contextroot/page.HTML                             GROUP 1


这是我在正则表达式中的第一个切入点:

^(.*[A-Z].*)(\??.*)$


没了这永远不会捕获查询字符串。

最佳答案

^/contextroot/([^?]*[A-Z][^?]*)(\?.*)?$


说明:

^/contextroot/  # literal start of URL
(               # match group 1
  [^?]*         # anything except `?` (zero or more)
  [A-Z]         # one capital letter
  [^?]*         # see above
)
(               # match group 2
  \?            # one ?
  .*            # anything that follows
)?              # optionally
$               # end of string

10-08 01:47