正则表达式找到主题标签,提及和链接

时间:2015-12-03 19:43:11

标签: c# regex

我需要从字符串中提取所有主题标签(#hashtag),提及(@user)和链接。

现在我正在使用这个:

@"((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|#|@|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)";

但它并不能识别以_开头的用户" @_ me"和这样的链接(https://blogs.windows.com/windowsexperience/2015/12/03/whats-new-for-windows-10-iot-this-fall/#.VmB1q2NPg2A.twitter)被部分识别。

如何改善我的正则表达式以获取所有可能的案例?

1 个答案:

答案 0 :(得分:0)

尝试此模式(请记得打开RegexOptions.IgnorePatternWhitespace选项):

(?'tag'(@|\#)(\w|_)+)
|
(?'link'((https?://)|(www\.))[\w$-_.+!*'(),]+)

对于这个字符串:

  

我的名字是来自#chicago的@_dave。访问我的城市www.choosechicago.com/things-to-do/祝您愉快!

它有3次捕获:tag组(@_dave#chicago下有2个,link组(www.choosechicago.com/things-to-do/下有1个)。

您可以使用Regex Storm

等正则表达式测试程序进行检查

说明

RegexOptions.IgnorePatternWhitespace允许您将模式分成多行,以便于阅读。而不是:

(?'tag'(@|#)(\w|_)+)|(?'link'www\.[\w$-_.+!*'(),]+)

您可以在打开选项时写下此内容:

(?'tag'(@|\#)(\w|_)+)           # capture @ and # tags into the tag group
|
(?'link'www\.[\w$-_.+!*'(),]+)  # capture hyperlinks, must begin with www

(?'tag'...)定义了一个名为tag的捕获组,因此您可以按名称Groups["tag"]引用它,而不是通过其位置值Groups[1]引用它。

[\w$-_.+!*'(),]+定义了URL中允许的字符列表,这是我从this question获得的。我还没有检查过RFC的规格,所以如果我错过了一些,就不要烧我。