Какой Java Regex можно использовать для сопоставления URL-адреса с заглавной буквой перед строкой запроса? - PullRequest
1 голос
/ 10 сентября 2010

Я пытаюсь создать регулярное выражение, соответствующее 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].*)(\??.*)$

Это сломано.Это никогда не захватывает строку запроса.

Ответы [ 2 ]

2 голосов
/ 10 сентября 2010
^/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    
2 голосов
/ 10 сентября 2010
(^/contextroot/(?=[^?A-Z]*[A-Z])[^?]*)(\?.*)?

Объяснение:

(                 # match group 1
  ^/contextroot/  #   literal start of URL (optional, remove if not needed)
  (?=             #   positive look-ahead...
    [^?A-Z]*      #     anything but a question mark or upper-case letters
    [A-Z]         #     a mandatory upper-case letter
  )               #   end look-ahead
  [^?]*           #   match anything but a question mark
)                 # end group 1
(                 # match group 2
  \?.*            #   a question mark and the rest of the query string
)?                # end group 2, make optional

Обратите внимание, что это предназначено для проверки одного URL-адреса и не работает при запуске с многострочной строкой.

Чтобы он работал с многострочным вводом (по одному URL на строку), внесите следующие изменения:

(^/contextroot/(?=[^?A-Z\r\n]*[A-Z])[^?\r\n]*)(\?.*)?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...