C# Regex创建html锚定标记

C# Regex创建html锚定标记,c#,regex,C#,Regex,我有一个用于用户评论的文本字段,用户可以或不可以在该字段中插入URL e、 g.它们可以有以下任何一种(加上其他变体): 请看更多的文字 请看更多的文字 请看更多的文字 请看更多的文字 看看www.google.com,这里可能还有更多的文字 我要做的是匹配这些,并更改字符串以包含HTML锚定标记 通过使用有关此主题的各种其他堆栈溢出答案,我得出了以下结论: text = text.Trim(); text = Regex.Replace(text, @"((https?|ftp):

我有一个用于用户评论的文本字段,用户可以或不可以在该字段中插入URL

e、 g.它们可以有以下任何一种(加上其他变体):

  • 请看更多的文字
  • 请看更多的文字
  • 请看更多的文字
  • 请看更多的文字
  • 看看www.google.com,这里可能还有更多的文字
我要做的是匹配这些,并更改字符串以包含HTML锚定标记

通过使用有关此主题的各种其他堆栈溢出答案,我得出了以下结论:

text = text.Trim();
text = Regex.Replace(text,
    @"((https?|ftp):\/\/(?:www\.|(?!www))[^\s\.]+\.[^\s]{2,}|www\.[^\s]+\.[^\s]{2,})",
    "<a target='_blank' href='$1'>$1</a>");
text=text.Trim();
text=Regex.Replace(text,
@“((https?| ftp):\/\/(?:www\.|(?!www))[^\s\.]+\.[^\s]{2,}www\.[^\s]+\.[^\s]{2,}”,
"");
这几乎可以完美地工作,它匹配所有必需的模式,但是当它与www.google.com(没有http(s):/)部分匹配时,创建的锚标记不正确,锚的href需要http://部分,或者它创建链接作为站点的相对url

如何更改上面的代码,以便在匹配不包含http://部分时,将其添加到锚的href部分


有趣的是,当我输入这个问题时,预览部分首先从我的URL创建链接——除了我的“麻烦”链接——没有http/ftp://前缀的链接。

使用匹配计算器检查组2(
(https?| ftp)
)是否匹配。如果没有,请使用一种逻辑,否则,请使用另一种逻辑

var text = "Look at http://google.com some more text here possibly,\nLook at www.google.com some more text here possibly";
text = text.Trim();
text = Regex.Replace(text,
    @"((https?|ftp)://(?:www\.|(?!www))[^\s.]+\.\S{2,}|www\.\S+\.\S{2,})", m => 
    m.Groups[2].Success ? 
       string.Format("<a target='_blank' href='{0}'>{0}</a>", m.Groups[1].Value) :
       string.Format("<a target='_blank' href='http://{0}'>{0}</a>", m.Groups[1].Value));
Console.WriteLine(text);
var text=“查看http://google.com 此处可能有更多文本,\n请访问www.google.com此处可能有更多文本”;
text=text.Trim();
text=Regex.Replace(text,
@“((https?| ftp):/(?:www\.|(?!www))[^\s.]+\.\s{2,}www\.\s+\.\s{2,})”,m=>
m、 组[2]。成功吗?
string.Format(“,m.Groups[1]。值):
string.Format(“,m.Groups[1].Value));
控制台写入线(文本);
请参阅,输出:

请在此处查看更多文本,
请看更多的文字
注意:我用
\s
替换了模式中的
[^\s]
,使其看起来“更漂亮”


您还可以删除外部捕获组(并使用
@”(https?| ftp):/(?:www.[^\s.]+\.\s{2,}www.\s+\.\s{2,}.
模式),然后检查
m.Groups[1]。Success
是否为真,并在替换中使用
m.Value

对此您无能为力。第一步是尝试并找到适用于所有情况的规则集(人类可读)。一些患有严重plenkitis的人经常省略空格,这会导致出现类似于
句尾的字符串。新句子
。在这种情况下,您不希望生成指向
http://sentence.new
。reg ex只会在www.someexample.com(即www.prefix)上出现,而不会在sense.new上出现。只是尝试完全了解这是如何工作的以及m.groups[2]部分让我困惑-你能为一个傻瓜解释一下吗?你的正则表达式包含两个用
(…)
定义的捕获组,请参阅。第一个是捕获整个模式的外部组(事实上,它甚至不是必需的,匹配值包含整个匹配,或
组[0]。值
,或者您可以始终通过字符串替换模式通过
$&
访问它),另一个是
http
/
ftp
。如果组2匹配,则其
success
属性设置为true。
Look at <a target='_blank' href='http://google.com'>http://google.com</a> some more text here possibly, 
Look at <a target='_blank' href='http://www.google.com'>www.google.com</a> some more text here possibly