如何在超链接Regex中包含连字符?

时间:2010-06-13 14:19:53

标签: c# asp.net regex

我正在尝试在用户输入的文本中查找链接并将其自动转换为链接。

我正在使用当前正则表达式,以便从文本中找到超链接。

Regex regexResolveUrl = new Regex("((http://|www\\.)([A-Z0-9.-:]{1,})\\.[0-9A-Z?;~&#=\\-_\\./]{2,})", RegexOptions.Compiled | RegexOptions.IgnoreCase);

对于我到目前为止所遇到的几乎所有链接都有效,但是当我想要检测带有超级链接的链接时它会产生问题。

即。 www.abc-xyz.com不起作用,有了上面的正则表达式,任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:8)

如果希望-在字符类定义中按字面意思表示破折号,则需要将其作为最后一个(或第一个)字符。因此[abc-]是一个包含4个字符的字符类,abc-。另一方面,[ab-c]仅包含3个字符,不包括-,因为-是范围定义。

所以,这样的事情(来自你的模式):

[A-Z0-9.-:]

定义3个范围,从AZ,从09,从.(ASCII 46)到: (ASCII 58)。你想要的是:

[A-Z0-9.:-]

参考


重复注意事项

我注意到您在模式中使用了{1,}来表示“一个或多个”。

.NET正则表达式(像大多数其他版本一样)支持这些简写:

  • ?:“零或一”{0,1}
  • *:“零或多”{0,}
  • +:“一个或多个”{1,}

他们可能需要一些时间来适应,但他们也很标准。

参考

相关问题


关于C#@的引用 - 引用字符串文字

虽然将正则表达式模式的字符串文字中的斜杠加倍是例如Java(在必要时),在C#中你实际上可以选择使用@ - 引用的字符串文字。

也就是说,这些字符串对是相同的:

"(http://|www\\.)"
@"(http://|www\.)"

"c:\\Docs\\Source\\a.txt"
@"c:\Docs\Source\a.txt"

使用@可以获得更可读的正则表达式模式,因为文字斜杠不必加倍(尽管另一方面,双引号现在必须加倍)。

参考

答案 1 :(得分:2)

将连字符添加为字符类中的第一个或最后一个字符。

答案 2 :(得分:2)

逃离连字符:

 Regex("((http://|www\\.)([A-Z0-9.\-:]{1,})\\.[0-9A-Z?;~&#=\\-_\\./]{2,})", RegexOptions.Compiled | RegexOptions.IgnoreCase);