我需要从字符串中提取所有主题标签(#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)被部分识别。
如何改善我的正则表达式以获取所有可能的案例?
答案 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的规格,所以如果我错过了一些,就不要烧我。