Regex - разделить URI по запросу и / или фрагменту - PullRequest
0 голосов
/ 21 сентября 2011

Используя это определение URI

 <scheme name> : <hierarchical part> [ ? <query> ] [ # <fragment> ]

Я хочу разделить это на три группы;1) схема + иерархия, 2) запрос, 3) фрагмент.

Некоторые примеры:

http://foo.com/bar?k1=v1&k2=v2#fragment = [http://foo.com/bar, ?k1=v1&k2=v2, #fragment]
http://foo.com/bar?k1=v1&k2=v2 = [http://foo.com/bar, ?k1=v1&k2=v2, ]
http://foo.com/bar#fragment = [http://foo.com/bar, , #fragment]
http://foo.com/bar = [http://foo.com/bar, , ]

На данный момент у меня есть .+(\?[^#]+)(.*)?$, который обрабатывает случаи 1 и 2, 4 нетсовпадение, что нормально, но у меня возникают проблемы при попытке изменить это для работы для случая 3.

Можно предположить, что URI правильно сформирован, нас заботит только наличие ? и #.

Контекст: у меня есть вход URI, который может содержать запрос и / или фрагмент, и мне нужно добавить к нему дополнительные параметры запроса.Таким образом, оценивая присутствие каждой группы, я могу выяснить, как мои параметры должны быть вставлены / добавлены в URI.

Реализация в Java.

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 21 сентября 2011

Попробуйте это:

(.+?)(\?.+?)?(#.+)?$
1 голос
/ 21 сентября 2011

http://mathiasbynens.be/demo/url-regex сравнивает точность многих регулярных выражений URL с набором тестов url & non-urls.Вы можете использовать это, чтобы выбрать тот, который меняет сложность на точность.

http://www.codinghorror.com/blog/2008/10/the-problem-with-urls.html также хорошая статья о проблемах с использованием URL для извлечения регулярных выражений.

Вы можете попробоватьчто-то вроде

^(https?://[^?#]+)(\\?[^#]+)?(#.+)?$

, если вы знаете, что ввод является URL-адресом, или используйте

(https?://[^?#\\s]+)(\\?[^#\\s]+)?(#\\S+)?

, чтобы найти соответствующие URL-адреса в тексте.

0 голосов
/ 21 сентября 2011

(.*)? Не создаст группу из-за ?.Кроме того, ваше регулярное выражение соответствует, только если в URL есть ?.# 3 не имеет ?, поэтому ставьте ? после \?.Попробуйте:

.+(\??[^#]+)(.*)$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...