特定标签的正则表达式
我正在.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。