正则表达式,如何提取分隔字符串并包含一些特殊单词?

Regex, How to extract a delimited string and containing some special words?

来自以下 html 脚本:

<p style="line-height:0;text-align:left">
    <font face="Arial">
        <span style="font-size:10pt;line-height:15px;">
            <br />
        </span>
    </font>
</p>
<p style="line-height:0;text-align:left">
    <font face="AR BLANCA">
        <span style="font-size:20pt;line-height:30px;">
            [designation]
        </span>
    </font>
</p>
<p style="line-height:0;text-align:left">
    &nbsp;&nbsp;
</p>

我要提取以下部分

<font face="AR BLANCA">
    <span style="font-size:20pt;line-height:30px;">
        [désignation]
    </span>
</font>

我试过这个正则表达式:

<font.*?font>

这可以分别提取两个匹配项,但是如何指定我想要包含 [] 的匹配项? 谢谢

一般来说,您不应该对 HTML 使用正则表达式——通常有很多更好的方法可以做到这一点。但是,在某些孤立的情况下,它工作得很好。假设这是其中一种情况,下面是使用正则表达式的方法。


当您这样想时,制作正则表达式通常很容易:写下您想要匹配的内容,然后根据需要用正则表达式替换部分内容。

我们要匹配

<font face="AR BLANCA">
    <span style="font-size:20pt;line-height:30px;">
        [désignation]
    </span>
</font>

我们不关心 face="AR BLANCA"> <span style="font-size:20pt;line-height:30px;">désignation</span> 是什么,所以将它们替换为 .*

<font .*[.*].*</font>

我们还必须确保转义所有特殊字符,否则 [.*] 会被误认为是 character class

<font .*\[.*\].*</font>

我们也想匹配所有个字符,但是大多数时候一个.只匹配非换行个字符. [\S\s] 是一个字符 class,根据定义匹配 所有 个字符。

<font [\S\s]*\[[\S\s]*\][\S\s]*</font>

我们终于遇到了最后一个问题——这个正则表达式将从第一个 <font 匹配到最后一个 </font>。对于您的 HTML 示例,使量词变得懒惰无济于事,因此我们需要做一些其他事情。据我所知,执行此操作的最佳方法是使用 here 解释的技巧。所以我们将 [\S\s]* 的每个实例替换为 ((?!</?font)[\S\s])*.

<font ((?!</?font)[\S\s])*\[((?!</?font)[\S\s])*\]((?!</?font)[\S\s])*</font>

Here's an online demonstration of this regex.

Html Agility Pack的方法:

using HtmlAgilityPack;
...

string htmlText = @"<p style=""line-height:0;text-align:left"">
...";

HtmlDocument html = new HtmlDocument();
html.LoadHtml(htmlText);
HtmlNode doc = html.DocumentNode;

HtmlNodeCollection nodes = doc.SelectNodes("//font[.//text()[contains(substring-after(., '['), ']')]]");

if (nodes != null)
{
    foreach (HtmlNode node in nodes)
    {
        Console.WriteLine(node.OuterHtml);
    }
}