我需要解析我的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
那么,为什么第三组不会直接在Bas-Rhin"
之后结束?
答案 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)
您的测试用例似乎没问题: