正则表达式没有正确结束

时间:2013-08-12 15:39:15

标签: c# asp.net regex

我需要解析我的HTML页面以替换某些链接,这是链接<a href="/{localLink:1144}" title="Bas-rhin">Mauris nec</a>的形式。问题是我的正则表达式没有正确结束,我认为这是因为“。

这是我的正则表达式:

Regex r= new Regex("<a href=\"(/{localLink:)(.*)}\" title=\"(.*)\">(.*)</a>");

正则表达式不会在每个链接后结束,第三组不包含title属性,但几乎所有的html都包含在我的html的最后一个。

我用这个网站测试了它:

http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx

enter image description here

那么,为什么第三组不会直接在Bas-Rhin"之后结束?

3 个答案:

答案 0 :(得分:1)

你问的问题的答案(“那么,为什么第三组不在Bas-Rhin"之后直接结束?”)是.*是贪婪的,这意味着它将消耗尽可能多的可能。将其替换为.*?以使其消耗尽可能少。

如果继续沿着这条路走下去,你可能会遇到许多问题的答案是正则表达式无法正确解析HTML,因为HTML不是常规语言。如果您的语言包含嵌套匹配令牌(例如<tag></tag>匹配或{}匹配)且嵌套深度没有限制(例如HTML,C系列语言,JSON等等,正则表达式根本无法解析或验证它。

答案 1 :(得分:1)

Regex r= new Regex("<a href=\"(/{localLink:)(.*)}\" title=\"(.*)\">(.*)</a>");

没有按预期工作,因为量词(*)默认是贪婪的,这意味着他们尽可能地抓住(最有可能)。

要解决这个问题,您有几种方法:

1最明显:

通过添加问号使您的量词变得懒惰:(.*?)

2效率最高:

不要使用点并使用否定的字符类代替。例如:

Regex r= new Regex("<a href=\"(/{localLink:)([^}]*)}\" title=\"([^"]*)\">(.*?)</a>");

最后(.*?)可以替换为:

((?>[^<]+|<(?!/a>)*)

3最合理:

使用agilitypack或其他html解析器来提取所有“a”标签。你可以检查href是否像你想要的那样。 (请注意,使用xpath,您可以直接在一个步骤中执行此检查)

Xpath查询示例:

//a[contains(@href, '{localLink:')]

答案 2 :(得分:0)

您的测试用例似乎没问题:

see here http://collapsar.ohost.de/pics/derek.png