C#正则表达式查找替换字符串中的URL

6

我想替换URL,例如www.google.com或http://www.google.com,用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链接。当我编写一个长链接时,它会重复同样的url,例如

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

我想把它写成这样:

<a href="http://www.google.com/search/asdadad/sdsdsd/sadasdx-sadasd-weqeqwe-zxcxzc.com">google.com/asdas... </a>

有什么最好的方法来实现这个?我对正则表达式很陌生。

1个回答

8

这也将捕获www.test.com

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

只需将可选部分括起来并附加一个问号即可。您可以在这里查看。
这个正则表达式中的第一个匹配项(匹配项由“(”和“)”定义)是整个URL。因此,您可以像这样使用替换:
Regex rgxUrls = new Regex(pattern);
string result = rgxUrls.Replace(yourText, "<a href=\"$1\"> space for custom text </a>");
                                                      ↑ Inserts first match

enter image description here

当我使用$1时,您也可以使用$2-$5。请查看上面显示哪些组捕获了URL的哪个部分的图像。

完整测试可以在此处找到here
只需点击顶部的执行即可。

输出: enter image description here


根据评论,组标题的工作原理如下:
Text: "this is your text to search"  
Pattern: "text to"

Match[0]总是匹配你的整个匹配文本。上面的每个组,如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的链接? - Ender Aric
你想将 www.google.de 替换为 http://www.google.de 吗?我会编辑我的问题并解释组标题。 - C4d
谢谢您的有用回答。我会采纳您的建议更新我的代码。 - Ender Aric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接