1

I have following regex:

^(<span style=.*?font-weight:bold.*?>.*?</span>)

It matches the following code:

<span style="font-family:Arial; font-size:10pt"> r.</span></p><p style="margin:0pt"><span style="font-family:Arial; font-size:10pt; font-weight:bold">&#xa0;</span>

But I would like to match only this part (last span containing font-weight:bold style)

<span style="font-family:Arial; font-size:10pt; font-weight:bold">&#xa0;</span>
4

3 回答 3

7

使用HTML Agility Pack解析 html:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(htmlContent);

var boldSpans = from s in doc.DocumentNode.SelectNodes("//span")
                let style = s.Attributes["style"].Value
                where style.Contains("font-weight:bold")
                select s;

甚至更好的 xpath,它在一行中选择所有节点:

doc.DocumentNode.SelectNodes("//span[contains(@style, 'font-weight:bold')]")
于 2013-07-30T13:59:14.577 回答
1

不要使用^,因为该行不是以您要匹配的跨度开头。

<span style=["'][^'"]*font-weight:bold[^'"]*['"]>[^<]*</span>

或作为转义字符串:

"<span style=[\"'][^'\"]*font-weight:bold[^'\"]*['\"]>[^<]*</span>"

这匹配<span style=以单引号或双引号',开头的字符串"。然后[^'"]*允许除结束引号之外的所有字符。

匹配 string font-weight:bold,后跟任意数量的字符,除了结束 qoutes 导致真正的结束 qoutes 和结束标记:[^'"]*['"]>

(请注意,您可能希望也可能不希望在属性之前和之后允许更多属性style。在这种情况下,您需要更改正则表达式)

span可以包含任意数量的任何字符,除了开始标签<,然后字符串必须以结束</span>标签结束。

于 2013-07-30T14:03:25.747 回答
0

删除 ^,因为它表示行首。因此,它将始终获得第一个跨度。更是如此,因为 .* 表示(任何字符)。

这样做第一场比赛可能仍然是你现在的输出,但第二场比赛应该是你所追求的。

此外,像 regexbuddy 之类的工具非常适合测试正则表达式。

于 2013-07-30T13:54:56.367 回答