【问题标题】:Regular expression for recognizing url识别url的正则表达式
【发布时间】:2011-08-18 12:49:59
【问题描述】:

我想为 url 创建一个正则表达式,以便从输入字符串中获取所有链接。 正则表达式应能识别以下格式的 url 地址:

  • http(s)://www.webpage.com
  • http(s)://webpage.com
  • www.webpage.com

还有更复杂的网址,例如: - 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。有人可以帮我创建一个合适的正则表达式吗?

编辑: 它应该可以找到合适的链接,并将链接放在合适的索引中,如下所示:

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;
            }

【问题讨论】:

标签: c# wpf regex url


【解决方案1】:

我不知道为什么你的匹配结果只有 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:#@%/;$()~_?\+,\-=\\.&] 我在列表中添加了一个逗号(否则您的长示例不匹配)转义了-(您正在创建一个字符范围)并且未转义.(在字符类中不需要。

查看here on Regexr,这是一个测试正则表达式的有用工具。

但是网址匹配不是一件简单的事,请see this question here

【讨论】:

  • :这就是我想要的!万分感谢。并感谢您的解释。
【解决方案2】:

我刚刚写了一篇关于识别最常用格式的 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 以查看完整的工作示例以及正则表达式的说明,以防您需要扩展或调整它。

【讨论】:

    【解决方案3】:

    您提供的正则表达式不适用于 www。地址,因为它需要 URI scheme(URL 之前的位,如 http://)。 “万维网”。正则表达式中的一部分不起作用,因为它只会匹配 www.:// (这是没有意义的)

    试试这样的:

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

    这将匹配具有有效 URI 方案的内容,或以“www”开头的内容。

    【讨论】:

    • 它不起作用。我有以下代码(我删除了一些更简单的东西)foreach(匹配匹配(RE_URL.Matches(new_text))){var link = new Hyperlink(new Run(match.Value)){NavigateUri = new Uri(匹配值)}; } 然后我的 match.Value 是 http:// only
    • @niao 为什么不将代码添加到您的问题中,并通过添加语言标签告诉我们您的语言?
    • @niao 我不知道为什么它不适合你。您是否使用分组号来提取输出字符串? (大概是5)。这个数字现在会有所不同。尝试将其增加 2(使用类似 7 的值)。
    猜你喜欢
    • 2011-06-18
    • 2019-01-06
    • 1970-01-01
    • 2023-01-16
    • 1970-01-01
    • 2022-12-04
    • 2015-01-23
    • 2012-03-01
    • 1970-01-01
    相关资源
    最近更新 更多