Regex在c#中的行为与regexr.com不同

本文关键字:regexr com 不同 Regex | 更新日期: 2023-09-27 17:51:14

我四处寻找一个正则表达式,可以从字符串中提取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# Match:
  "http://www.fedex.com/Tracking?action=track&tracknumbers=187880016501597">"

我不明白为什么c#在匹配字符串的末尾添加">。我认为它可能与原始测试字符串中出现在它之前的转义字符有关。我希望得到相同的结果,regexr.com得到。

Regex在c#中的行为与regexr.com不同

我认为Lasse(在评论中)。为您指明了正确的方向,因为您正在获得额外的字符匹配。

。. NET正则表达式不支持POSIX字符类,因此[:punct:]将不匹配标点符号和符号[!"#$%&'()*+,'-./:;<=>?@ [''']^_{|}~](原始正则表达式所依赖的)。您要么必须替换所需的标点符号(这看起来相当麻烦),要么找到一个替代的正则表达式。

关于支持/不支持的行为的更多详细信息可以在这里找到:http://www.regular-expressions.info/refcharclass.html

我使用了您列出的Regex,并对与url部分匹配的位进行了轻微调整,使其工作:

来自:

[^'s()<>]

更改为:

[.])[^'s()<>'"'']

排除末尾不想要的字符。所以最终的正则表达式是:

'b((['w-]+://?|www[.])[^'s()<>'"'']+(?:'(['w'd]+')|([[^'w]'s]|)))

至于:punct:位是什么,我不知道!也许它是一些字符集你的正则表达式工具的标点符号。不确定。无论如何,我如上所示对它进行了调整,至少对于您的测试用例,它可以工作。然而,考虑到更多的示例数据,这部分Regex可能需要注意一下。