-1

我需要解析我的 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"呢?

4

3 回答 3

1

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

如果您继续走这条路,您可能会遇到的许多问题的答案是正则表达式无法正确解析 HTML,因为 HTML 不是常规语言。如果您的语言具有嵌套匹配标记(例如<tag>匹配</tag>{匹配})并且没有嵌套深度限制(HTML、C 系列语言、JSON 和许多其他语言中的情况),则正则表达式根本不起作用解析或验证它。

于 2013-08-12T15:55:04.740 回答
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:')]
于 2013-08-12T16:01:59.753 回答
0

您的测试用例似乎很好:

见这里 http://collapsar.ohost.de/pics/derek.png

于 2013-08-12T16:20:33.080 回答