我环顾四周寻找一个正则字符串,它会从字符串中提取一个url并找到这个。
\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))
问题是当我在regexr.com上的以下字符串上测试它时它匹配正确,但在c#中使用它时却没有。
测试字符串:
"<a style=\"color: blue;\" target=\"_blank\" href=\"http://www.fedex.com/Tracking?action=track&tracknumbers=187880016501597\">Track FedEx Ground 187880016501597</a>"
Regexr匹配:
"http://www.fedex.com/Tracking?action=track&tracknumbers=187880016501597"
C#匹配:
"http://www.fedex.com/Tracking?action=track&tracknumbers=187880016501597">"
我无法弄清楚为什么c#在匹配字符串的末尾添加“&gt;。我认为它可能与原始测试字符串中的转义符号有关。我我希望获得与regexr.com相同的结果。如果有人有任何想法,请告诉我,谢谢。
答案 0 :(得分:1)
我认为Lasse(在评论中)。已经指出了正确的方向,因为你获得了额外的角色匹配。
.NET Regex不支持POSIX character classes,因此[:punct:]
无法匹配标点符号[!"#$%&'()*+,\-./:;<=>?@ [\\\]^_{|}~]
(原始正则表达式所依赖的)。你要么必须用所需的标点符号替换(这看起来很麻烦),要么找到另一种正则表达式。
有关支持/不支持的行为的其他详细信息,请访问:http://www.regular-expressions.info/refcharclass.html
答案 1 :(得分:0)
我与你列出的正则表达式进行了一次游戏,并通过一个小调整来匹配部分网址:
自:
[^\s()<>]
更改为:
[.])[^\s()<>\"\\]
这排除了你不想要的最后字符。所以最终的正则表达式是:
\b(([\w-]+://?|www[.])[^\s()<>\"\\]+(?:\([\w\d]+\)|([[^\w]\s]|)))
至于:punct:
位是什么,我不知道!也许它是一些字符集用于标点符号的正则表达式工具。不确定。无论如何,我如上所示调整了它,至少对你的测试用例来说,它是有效的。但是,考虑到一些更多的样本数据,正则表达式的那部分可能需要一些关注。