Вопрос: Регулярное выражение для анализа URL-адресов из текста


У меня есть это регулярное выражение:

[А-г] + [:.] * \ S.?

Я запускаю его по следующему тексту:

regexbuddy.com
www.regexbuddy.com
http://regexbuddy.com cvc
http://www.regexbuddy.com cvcv
http://www.regexbuddy.com/ g
http://www.regexbuddy.com/index.html f
http://www.regexbuddy.com/index.html?source=library f
You can download RegexBu    ddy at http://www.regexbuddy.com/download.html. f
"www.domain.com/quoted URL with spaces"
http://10.2.2.1.2/ttxx/txt/gg v
support@regexbuddy.com

Мне нужно сопоставить следующее: только полужирный текст:

Как я могу это сделать?

ОБНОВИТЬ

@slhck ваше исправленное регулярное выражение соответствует почти всем, кроме URL-адреса, начинающегося с www. например  - "www.domain.com/quoted URL с пробелами"

Я сделал некоторые изменения в регулярном выражении, чтобы соответствовать ведущему www. Это выглядит как

(HTTPS): //.(= \ S?) | (WWW.).(? = \ S)

Не могли бы вы пересмотреть? и предложить, если существуют более эффективные способы их сопоставления.


2
2017-07-23 13:36


Источник


Спасибо за улучшение вашего вопроса; возобновлено. Но, пожалуйста, уточните ... почему вам нужно соответствовать http://regexbuddy.com а также www.regexbuddy.com, но нет http://www.regexbuddy.com, и не http://www.regexbuddy.com/index.html? Здесь нет рисунка ... - slhck


Ответы:


Если вы не хотите включать конечные пробелы в соответствие, используйте отрицательный результат:

[a-z]+[:.].*?(?=\s)

В вашем примере это будет соответствовать:

regexbuddy.com
www.regexbuddy.com
http://regexbuddy.com
http://www.regexbuddy.com
http://www.regexbuddy.com/
http://www.regexbuddy.com/index.html
http://www.regexbuddy.com/index.html?source=library
http://www.regexbuddy.com/download.html.
www.domain.com/quoted
http://10.2.2.1.2/ttxx/txt/gg

Для дальнейшего соответствия только http или https, и необязательный www используйте что-то вроде:

(https?):\/\/(www\.)?[a-z0-9\.:].*?(?=\s)

Вот Регулярное выражение Джона Грубера для проверки того, что выглядит как URL-адрес, который, по-видимому, очень хорошо работает в вашем случае:

(?i)\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))

Но, честно говоря, все эти подходы рано или поздно получат ложные совпадения. Если вам нужно регулярное выражение для анализа URL-адресов, см. Этот вопрос «Переполнение стека»: Какое лучшее регулярное выражение проверяет правильность строки?


6
2017-07-23 13:51



 Эй, я застрял с чем-то, вы можете увидеть обновленный вопрос, пожалуйста? - asadz
Это сложнее, так как вам нужно проверить, есть ли www - Я добавил пример от Джона Грубера, который должен работать в вашем случае. - slhck