特定标签的正则表达式

时间:2020-03-05 18:57:40  来源:igfitidea点击:

我正在.NET项目中使用正则表达式来获取特定标签。我想匹配整个DIV标签及其内容:

<html>
   <head><title>Test</title></head>
   <body>
     <p>The first paragraph.</p>
     <div id='super_special'>
        <p>The Store paragraph</p>
     </div>
     </body>
  </head>

代码:

Regex re = new Regex("(<div id='super_special'>.*?</div>)", RegexOptions.Multiline);

    if (re.IsMatch(test))
        Console.WriteLine("it matches");
    else
        Console.WriteLine("no match");

我要匹配这个:

<div id="super_special">
   <p>Anything could go in here...doesn't matter.  Let's get it all</p>
</div>

我以为.应该可以得到所有字符,但是回车似乎有点麻烦。我的正则表达式缺少什么?

谢谢。

解决方案

回答

取决于我们使用的语言。
例如,在perl中,我们将使用regex修饰符s:

m{<div id="super_special">.*?</span>}s

回答

我们使用什么语言?在.NET中,我们必须设置一个选项以确保它不是单行。

回答

。 (点)匹配除换行符\ r和\ n之外的任何单个字符。大多数正则表达式类型也可以选择使点匹配换行符。 。匹配x或者(几乎)任何其他字符

回答

可能:。[\ r \ n]。[\ r \ n]

回答

取决于语言。如果在python上,则缺少re.S标志,如下所示(以删除匹配项):

re.compile('<div id="super_special">.*?</div>',re.S).sub(your_html,'')

对于其他正则表达式实现,也存在类似的标志,它们被称为"单行"或者"多行"或者类似的标志。

但是,请勿使用正则表达式来解析HTML。这是通向维护地狱的直接途径。使用HTML解析器,例如Beautiful Soup。检查这些链接以获取该方向上的有用资源。

回答

求我们了,请求我们了,帮自己一个大忙:使用HTML解析器解析HTML。严重地。那就是他们的目的。

HTML是一种非常复杂的语言。无论我们要进行多长时间的调整,摆弄,修复,磨光Regexp,总会遇到失踪的情况。

无论如何,我们必须告诉Regexp引擎匹配多行而不是仅一行。在一些最流行的方法中,我们可以通过应用/ m修饰符来实现。

但让我重复一遍:请使用HTML解析器。每当有人使用Regexp解析HTML时,一只小猫就会死...

回答

问题是。默认情况下,元字符与换行符不匹配。我们必须使用单行修饰符来实现此目的。在.NET中,我们可以将RegexOptions.SingleLine用作所使用方法的最后一个参数,也可以直接在模式中使用修饰符,例如:

(?s)(<div id="super_special">.*?</div>)

回答

大多数语言都有一些制作方法。匹配换行符:

  • 在Java中:Pattern.compile(" pattern",Pattern.MULTILINE);
  • 在Perl和Ruby中:/ pattern / m
  • 在VB中:Regex.IsMatch(s," pattern",RegexOptions.Multiline)

通常,使用regexp匹配XML / HTML不是一个好主意,因为XML / HTML标记可以嵌套,例如:

<div id="super_special">
     <div>Nothing</div>
     <p>Anything could go in here...doesn't matter.  Let's get it all</p>
  </div>

...在这里我们可以轻松地匹配:

<div id="super_special">
     <div>Nothing</div>

另一方面,如果我们确定要匹配的HTML对于正则表达式始终是安全的,那么请不要让我阻止我们(尽管那样,即使这样,我们也应该三思而后行,以免将来的自我从潜在的调试中受益头痛)。

回答

开箱即用,无需特殊修饰符,大多数正则表达式实现都不会超出行尾以匹配文本。我们可能应该查看用于此类修饰符的正则表达式引擎的文档。

我还有一个建议:提防贪婪!传统上,正则表达式是贪婪的,这意味着正则表达式可能与此匹配:

<div id="super_special">
  I'm the wanted div!
</div>
<div id="not_special">
  I'm not wanted, but I've been caught too :(
</div>

我们应该检查" not-greedy"修饰符,以便正则表达式将在第一个出现的</ div>而不是最后一个出现时停止匹配文本。

另外,正如其他人所说,请考虑使用HTML解析器而不是正则表达式。它将为我们节省很多头痛。

编辑:如果嵌套<div>,即使是非贪婪的正则表达式也不会按预期工作!考虑使用HTML解析器的另一个原因。

回答

这些正则表达式建议均无效。根据它们是否贪婪,它们将与文档中的最后一个</ div>或者起始字符串之后的第一个</ div>匹配,起始字符串可能是嵌套在我们所在的div中的div有兴趣。

正则表达式并不是实现此目的的理想工具,但是如果情况足够简单,并且我们真的不想解析HTML,则可以使用Microsoft专有的.NET扩展名来进行正则表达式。有关详细的说明,请参见Morten Maate的这篇不错的文章。

回答

单靠正则表达式根本不足以解决问题。我们需要更强大的功能,例如上下文无关的语法。请参阅Wikipedia的Chomsky层次结构。

换句话说(如前所述),请勿使用正则表达式来解析HTML。