Это регулярное выражение соответствует и не должно. Почему это? - PullRequest
5 голосов
/ 27 октября 2009

Это регулярное выражение:

^ ((HTTPS | FTP) \: (\ / \ /) | (файл \: \ / {2,3}))? (((25 [0-5] | 2 [0-4] [0- 9] |?. [01] [0-9] [0-9]) \) {3} (25 [0-5] | 2 [0-4] [0-9] | [01] [0-9] [0-9]?)) | (((([A-Za-Z0-9 ] +) (\.)?) +?) (\.) ([AZ] {2} | Ком | орг | чистые | г | млн | бизнес | информация | моби | имя | аэро | работа |? Музей)) ([? A-Za-Z0-9 \ \ = \ & \% \ /] *) $

Отформатировано для удобства чтения:

^( # Begin regex / begin address clause
  (https?|ftp)\:(\/\/)|(file\:\/{2,3}))? # protocol
  ( # container for two address formats, more to come later
   ((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}
   (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?) # match IP addresses
  )|( # delimiter for address formats
   ((([a-zA-Z0-9]+)(\.)?)+?) # match domains and any number of subdomains
   (\.) #dot for .com
   ([a-z]{2}|com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum) #TLD clause
  ) # end address clause
([a-zA-Z0-9\?\=\&\%\/]*)? # querystring support, will pretty this up later
$

соответствует:

www.google

и не должно быть. Это один из моих "неудачных" тестов. Я объявил часть URL TLD обязательной при сопоставлении по альфа-адресу, а не по IP-адресу, и "google" не вписывается в предложение "[a-z] {2}".

Имейте в виду, что я буду устранять следующие проблемы отдельно - этот вопрос о том, почему он соответствует www.google и не должен.

  • Строка запроса должна поддерживать только правильные форматы, в настоящее время принимает любую комбинацию символов строки запроса
  • Некоторые протоколы не поддерживаются, хотя в мои требования они могут не входить
  • необычные TLD с 3 символами, не включенными
  • Возможно, соответствует http://www.google. .com - проверяет наличие последовательных точек
  • Не поддерживает десятичные форматы IP-адресов

Что не так с моим регулярным выражением?

edit: См. Также предыдущую проблему с более ранней версией этого регулярного выражения в другом тестовом примере: Как мне правильно настроить регулярное выражение?



edit2: Исправлено - исправлено регулярное выражение (как было предложено):

^ ((HTTPS | FTP) \: (\ / \ /) | (файл \: \ / {2,3}))? (((25 [0-5] | 2 [0-4] [0- 9] |?. [01] [0-9] [0-9]) \) {3} (25 [0-5] | 2 [0-4] [0-9] | [01] [0-9] [0-9]?)) | (((([A-Za-Z0-9 ] +) (\)) +) (\) ([AZ] {2} |.?. ком | орг | чистые | г | млн | бизнес | информация | моби | имя | аэро | работа | музей)) ( [\ /] [\ / а-Za-z0-9 \.] *) *? ([\ /]? [\] [A-Za-Z0-9 \ = \ & \% \ /] *) ? $

Ответы [ 3 ]

12 голосов
/ 27 октября 2009

"Google" может не вписываться в [a-z]{2}, но оно вписывается в [a-z]{2}([a-zA-Z0-9\?\=\&\%\/]*)? - вы забыли указать / после TLD, если URL выходит за пределы домена. Таким образом, он интерпретирует его как «www.go» в качестве домена, а затем «ogle», следуя за ним, без косой черты между ними. Вы можете исправить это, добавив [?/] в начале этой последней группы, чтобы потребовался один из этих двух символов между TLD и любой дополнительной частью URL.

2 голосов
/ 27 октября 2009

Google "не вписывается в предложение" [a-z] {2} ".

Но "go" делает, а затем "ogle" соответствует "([a-zA-Z0-9 \? \ = \ & \% /] *)?"

2 голосов
/ 27 октября 2009

Ваше предложение TLD соответствует "go" в google, а часть поддержки строки запроса соответствует "ogle" впоследствии. Попробуйте изменить часть строки запроса на это:

([?/][a-zA-Z0-9\?\=\&\%\/]*)?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...