Regex для проверки URI
Как вы создаете регулярное выражение, которое соответствует только действительному URI. Описание URI можно найти здесь: http://en.wikipedia.org/wiki/URI_scheme. Ему не нужно извлекать какие-либо детали, просто проверьте, действительно ли URI.
(предпочтительный формат -.Net RegularExpression) (.Net Version 1.1)
- Не стоит проверять известный протокол, только действительный.
Текущее решение:
^([a-zA-Z0-9+.-]+):(//([a-zA-Z0-9-._~!$&'()*+,;=:]*)@)?([a-zA-Z0-9-._~!$&'()*+,;=]+)(:(\\d*))?(/?[a-zA-Z0-9-._~!$&'()*+,;=:/]+)?(\\?[a-zA-Z0-9-._~!$&'()*+,;=:/[email protected]]+)?(#[a-zA-Z0-9-._~!$&'()*+,;=:/[email protected]]+)?$(:(\\d*))?(/?[a-zA-Z0-9-._~!$&'()*+,;=:/]+)?(\?[a-zA-Z0-9-._~!$&'()*+,;=:/[email protected]]+)?(\#[a-zA-Z0-9-._~!$&'()*+,;=:/[email protected]]+)?$
Ответы
Ответ 1
Этот сайт выглядит многообещающим: http://snipplr.com/view/6889/regular-expressions-for-uri-validationparsing/
Они предлагают следующее регулярное выражение:
/^([a-z0-9+.-]+):(?://(?:((?:[a-z0-9-._~!$&'()*+,;=:]|%[0-9A-F]{2})*)@)?((?:[a-z0-9-._~!$&'()*+,;=]|%[0-9A-F]{2})*)(?::(\d*))?(/(?:[a-z0-9-._~!$&'()*+,;=:@/]|%[0-9A-F]{2})*)?|(/?(?:[a-z0-9-._~!$&'()*+,;=:@]|%[0-9A-F]{2})+(?:[a-z0-9-._~!$&'()*+,;=:@/]|%[0-9A-F]{2})*)?)(?:\?((?:[a-z0-9-._~!$&'()*+,;=:/[email protected]]|%[0-9A-F]{2})*))?(?:#((?:[a-z0-9-._~!$&'()*+,;=:/[email protected]]|%[0-9A-F]{2})*))?$/i
Ответ 2
Работает ли Uri.IsWellFormedUriString?
Ответ 3
спецификация URI говорит:
Следующая строка представляет собой регулярное выражение для разбиения хорошо сформированного ссылочного кода URI на его компоненты.
^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
(я предполагаю, что такое же регулярное выражение, что и в ссылке STD66, приведенное в другом ответе.)
Но распад не проверяется. Чтобы правильно проверить URI, нужно было бы перевести BNF для URI в регулярное выражение. Хотя некоторые BNF не могут быть выражены в виде регулярных выражений, я думаю, что с этим можно было бы это сделать. Но это не должно быть сделано - это был бы огромный беспорядок. Лучше использовать библиотечную функцию.
Ответ 4
Лучшее и наиболее полное руководство к этому я нашел здесь: http://jmrware.com/articles/2009/uri_regexp/URI_regex.html (Отвечая на ваш вопрос, см. URI)
Все эти правила из RFC3986 воспроизводятся в Таблице 2 вместе с реализацией регулярного выражения для каждого правила.
Эта реализация javascript доступна здесь: https://github.com/jhermsmeier/uri.regex
Для справки повторное выражение URI повторяется ниже:
# RFC-3986 URI component: URI
[A-Za-z][A-Za-z0-9+\-.]* : # scheme ":"
(?: // # hier-part
(?: (?:[A-Za-z0-9\-._~!$&'()*+,;=:]|%[0-9A-Fa-f]{2})* @)?
(?:
\[
(?:
(?:
(?: (?:[0-9A-Fa-f]{1,4}:) {6}
| :: (?:[0-9A-Fa-f]{1,4}:) {5}
| (?: [0-9A-Fa-f]{1,4})? :: (?:[0-9A-Fa-f]{1,4}:) {4}
| (?: (?:[0-9A-Fa-f]{1,4}:){0,1} [0-9A-Fa-f]{1,4})? :: (?:[0-9A-Fa-f]{1,4}:) {3}
| (?: (?:[0-9A-Fa-f]{1,4}:){0,2} [0-9A-Fa-f]{1,4})? :: (?:[0-9A-Fa-f]{1,4}:) {2}
| (?: (?:[0-9A-Fa-f]{1,4}:){0,3} [0-9A-Fa-f]{1,4})? :: [0-9A-Fa-f]{1,4}:
| (?: (?:[0-9A-Fa-f]{1,4}:){0,4} [0-9A-Fa-f]{1,4})? ::
) (?:
[0-9A-Fa-f]{1,4} : [0-9A-Fa-f]{1,4}
| (?: (?: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]?)
)
| (?: (?:[0-9A-Fa-f]{1,4}:){0,5} [0-9A-Fa-f]{1,4})? :: [0-9A-Fa-f]{1,4}
| (?: (?:[0-9A-Fa-f]{1,4}:){0,6} [0-9A-Fa-f]{1,4})? ::
)
| [Vv][0-9A-Fa-f]+\.[A-Za-z0-9\-._~!$&'()*+,;=:]+
)
\]
| (?:(?: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\-._~!$&'()*+,;=]|%[0-9A-Fa-f]{2})*
)
(?: : [0-9]* )?
(?:/ (?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})* )*
| /
(?: (?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})+
(?:/ (?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})* )*
)?
| (?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})+
(?:/ (?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})* )*
|
)
(?:\? (?:[A-Za-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9A-Fa-f]{2})* )? # [ "?" query ]
(?:\# (?:[A-Za-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9A-Fa-f]{2})* )? # [ "#" fragment ]
Ответ 5
Существуют ли какие-то определенные URI, которые вам нужны, или вы пытаетесь найти одно регулярное выражение, которое проверяет STD66?
Я собирался указать вам это регулярное выражение для разбора URI. Тогда вы могли бы, теоретически, проверить, есть ли все элементы, о которых вы заботитесь.
Но я думаю, bdukes лучше.
Ответ 6
Лучшее регулярное выражение, которое я разработал в соответствии с RFC 3986 (https://tools.ietf.org/html/rfc3986), было следующим:
![Блок-схема регулярного выражения с использованием https://regexper.com]()
// named groups
/^(?<scheme>[a-z][a-z0-9+.-]+):(?<authority>\/\/(?<user>[^@][email protected])?(?<host>[a-z0-9.\-_~]+)(?<port>:\d+)?)?(?<path>(?:[a-z0-9-._~]|%[a-f0-9]|[!$&'()*+,;=:@])+(?:\/(?:[a-z0-9-._~]|%[a-f0-9]|[!$&'()*+,;=:@])*)*|(?:\/(?:[a-z0-9-._~]|%[a-f0-9]|[!$&'()*+,;=:@])+)*)?(?<query>\?(?:[a-z0-9-._~]|%[a-f0-9]|[!$&'()*+,;=:@]|[/?])+)?(?<fragment>\#(?:[a-z0-9-._~]|%[a-f0-9]|[!$&'()*+,;=:@]|[/?])+)?$/i
// unnamed groups
/^([a-z][a-z0-9+.-]+):(\/\/([^@][email protected])?([a-z0-9.\-_~]+)(:\d+)?)?((?:[a-z0-9-._~]|%[a-f0-9]|[!$&'()*+,;=:@])+(?:\/(?:[a-z0-9-._~]|%[a-f0-9]|[!$&'()*+,;=:@])*)*|(?:\/(?:[a-z0-9-._~]|%[a-f0-9]|[!$&'()*+,;=:@])+)*)?(\?(?:[a-z0-9-._~]|%[a-f0-9]|[!$&'()*+,;=:@]|[/?])+)?(\#(?:[a-z0-9-._~]|%[a-f0-9]|[!$&'()*+,;=:@]|[/?])+)?$/i
группы захвата
- схема
- власть
- userinfo
- хост
- Порт
- путь
- Запрос
- фрагмент