Регулярное выражение для распознавания URL - PullRequest
1 голос
/ 18 августа 2011

Я хочу создать регулярное выражение для URL, чтобы получить все ссылки из входной строки. Regex должен распознавать следующие форматы URL-адреса:

  • HTTP (s): //www.webpage.com
  • http (s): //webpage.com
  • www.webpage.com 1008 *

а также более сложные URL, такие как: - http://www.google.pl/#sclient=psy&hl=pl&site=&source=hp&q=regex+url&pbx=1&oq=regex+url&aq=f&aqi=g1&aql=&gs_sm=e&gs_upl=1582l3020l0l3199l9l6l0l0l0l0l255l1104l0.2.3l5l0&bav=on.2,or.r_gc.r_pw.&fp=30a1604d4180f481&biw=1680&bih=935

У меня есть следующий

((www\.|https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\))+[\w\d:#@%/;$()~_?\+-=\\\.&]*)

но он не распознает следующий шаблон: www.webpage.com. Может кто-нибудь помочь мне создать подходящее регулярное выражение?

EDIT: Должно работать, чтобы найти подходящую ссылку и, кроме того, поместить ссылку в соответствующий индекс, например:

private readonly Regex RE_URL = new Regex(@"((https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\))+[\w\d:#@%/;$()~_?\+-=\\\.&]*)", RegexOptions.Multiline);
foreach (Match match in (RE_URL.Matches(new_text)))
            {
                // Copy raw string from the last position up to the match
                if (match.Index != last_pos)
                {
                    var raw_text = new_text.Substring(last_pos, match.Index - last_pos);
                    text_block.Inlines.Add(new Run(raw_text));
                }

                // Create a hyperlink for the match
                var link = new Hyperlink(new Run(match.Value))
                {
                    NavigateUri = new Uri(match.Value)
                };
                link.Click += OnUrlClick;

                text_block.Inlines.Add(link);

                // Update the last matched position
                last_pos = match.Index + match.Length;
            }

Ответы [ 3 ]

4 голосов
/ 18 августа 2011

Я не знаю, почему ваш результат в совпадении только http://, но я немного очистил ваше регулярное выражение

((?:(?:https?|ftp|gopher|telnet|file|notes|ms-help):(?://|\\\\)(?:www\.)?|www\.)[\w\d:#@%/;$()~_?\+,\-=\\.&]+)

(?:) - это группы без захвата, это означает, что существует только одна группа захватаслева и содержит полную совпавшую строку.

(?:(?:https?|ftp|gopher|telnet|file|notes|ms-help):(?://|\\\\)(?:www\.)?|www\.) Теперь ссылка должна начинаться с чего-то из первого списка, за которым следует необязательный www. или www.

[\w\d:#@%/;$()~_?\+,\-=\\.&] Я добавил запятую в список (в противном случае ваш длинный пример не соответствует) экранировал - (вы создавали диапазон символов) и удалил экранирование . (не требуется в классе символов.

См. Здесь здесь, в Regexr , полезном инструменте для проверки регулярных выражений.

Но сопоставление URL-адресов не простая задача, см. Этот вопрос здесь

3 голосов
/ 23 ноября 2011

Я только что написал сообщение в блоге о распознавании URL в наиболее используемых форматах, таких как:

www.google.com http://www.google.com mailto:somebody@google.com somebody@google.com www.url-with-querystring.com/?url=has-querystring

Используется регулярное выражение /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)/, однако я бы порекомендовал вам перейти на http://blog.mattheworiordan.com/post/13174566389/url-regular-expression-for-links-with-or-without-the, чтобы увидеть полный рабочий пример вместе с объяснением регулярного выражения на случай, если вам нужно его расширить или настроить. *

2 голосов
/ 18 августа 2011

Регулярное выражение, которое вы даете, не работает для www.адреса, потому что она ожидает URI-схему (бит перед URL, например http://). Часть «www.» в вашем регулярном выражении не работает, потому что она будет соответствовать только www.:// (что бессмысленно)

Вместо этого попробуйте что-то вроде этого:

(((https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\))+)|(www\.)[\w\d:#@%/;$()~_?\+-=\\\.&]*)

Это будет соответствовать что-то с допустимой схемой URI, или что-то, начинающееся с 'www.'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...