正则表达式在c#中的行为与在regexr.com上的行为不同

时间:2014-03-21 21:43:12

标签: c# regex

我环顾四周寻找一个正则字符串,它会从字符串中提取一个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相同的结果。如果有人有任何想法,请告诉我,谢谢。

2 个答案:

答案 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:位是什么,我不知道!也许它是一些字符集用于标点符号的正则表达式工具。不确定。无论如何,我如上所示调整了它,至少对你的测试用例来说,它是有效的。但是,考虑到一些更多的样本数据,正则表达式的那部分可能需要一些关注。