【问题标题】:c# find and replace urls from string with regexc#用正则表达式从字符串中查找和替换url
【发布时间】:2016-04-16 07:10:34
【问题描述】:

我想用 www.google.com 替换网址,例如 www.google.com 或 http://www.google.com 我有这个代码

str = Regex.Replace(str,
                @"((http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?)",
                "<a target='_blank' href='$1'>$1</a>");

它与http://www.google.com 一起使用,但它不适用于www.google.comsubdomain.google.com,正则表达式代码与每个url 链接匹配。当我写一个长链接时,它会写相同的网址,例如

http://www.google.com/search/asdadad/sdsdsd/sadasdx-sadasd-weqeqwe-zxcxzc.com

。我想写成

&lt;a href="http://www.google.com/search/asdadad/sdsdsd/sadasdx-sadasd-weqeqwe-zxcxzc.com"&gt;google.com/asdas... &lt;/a&gt;

制作这个的最好方法是什么?我是正则表达式的新手

【问题讨论】:

    标签: c# asp.net regex


    【解决方案1】:

    这也会捕获www.test.com:

    (((http|ftp|https):\/\/)?[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&amp;:\/~\+#]*[\w\-\@?^=%&amp;\/~\+#])?)
     ↑---------------------↑↑
    

    只需将可选的部分括起来并附加一个问号。 你可以去看看here.


    这个正则表达式中的第一个匹配项(匹配项用“(”和“)”定义)是整个 url。所以你可以像这样使用替换:

    Regex rgxUrls = new Regex(pattern);
    string result = rgxUrls.Replace(yourText, "<a href=\"$1\"> space for custom text </a>");
                                                          ↑ Inserts first match
    

    在我使用$1 的地方,您也可以使用$2 - $5。检查上面的图片,显示哪些组正在捕获 url 的哪一部分。

    可以找到完整测试 here.
    只需点击顶部的执行

    输出:


    根据 cmets,组标题的工作原理:

    Text: "this is your text to search"  
    Pattern: "text to"
    

    Match[0] 将始终匹配您的整个匹配 text to。上面的每个组,如 Match[1]Match[2] 都必须用“(”和“)”定义。

    Text: "this is your text to search"  
    Pattern: "text (to)"  
    Match[0]: "text to"  
    Match[1]: "to"  
    
    
    Pattern: "text (t(o))"  
    Match[0]: "text to"  
    Match[1]: "to"  
    Match[2]: "o"  
    

    带有“()”的标题从外到内起作用。

    $1
    (((http|ftp|https):\/\/)?[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&amp;:\/~\+#]*[\w\-\@?^=%&amp;\/~\+#])?)
    ↑--------------------------------------------------------------------------------------------------↑
    
    $2 (http://)
    (((http|ftp|https):\/\/)?[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&amp;:\/~\+#]*[\w\-\@?^=%&amp;\/~\+#])?)
     ↑---------------------↑
    
    $3 (http)
    (((http|ftp|https):\/\/)?[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&amp;:\/~\+#]*[\w\-\@?^=%&amp;\/~\+#])?)
      ↑--------------↑
    
    $4 (.com)
    (((http|ftp|https):\/\/)?[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&amp;:\/~\+#]*[\w\-\@?^=%&amp;\/~\+#])?)
                                     ↑----------↑   
    
    $5 (/appendedSubdirectory/anotherOne)
    (((http|ftp|https):\/\/)?[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&amp;:\/~\+#]*[\w\-\@?^=%&amp;\/~\+#])?)
                                                  ↑--------------------------------------------------↑   
    

    我无法在这里解释有关正则表达式的所有内容。这个问题看起来对我来说已经解决了。如果您根据正则表达式有更深层次的问题,请开始一个新问题并展示您之前所做的一些努力。

    【讨论】:

    • 感谢您的回答。但我必须学会编辑匹配值。 1 美元正在获得完整地址。我想编辑 $1 例如matched_value.Substring(0,5) 什么是正确的方法?第二个问题:找到并替换为您的代码的网址 www.google.com 但链接没有http。所以当我点击链接时,它会显示 mydomain.com/www.google.com 如何添加带有 http 的链接
    • 您想用http://www.google.de 替换www.google.de?我将编辑我的问题并解释组标题。
    • 感谢您的帮助。我会根据你的建议更新我的代码。
    猜你喜欢
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    相关资源
    最近更新 更多