我正在.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>
我认为.
应该得到所有角色,但似乎有回车问题。我的正则表达式遗失了什么?
感谢。
答案 0 :(得分:6)
请相当,请自己做一个巨大的青睐:使用HTML解析器来解析HTML。认真。这就是他们的目的。
HTML是非常复杂的语言。无论多长时间你将调整,摆弄,修复,磨练你的Regexp,总是就是你错过的案例。
无论如何,你必须告诉你的Regexp引擎匹配多行,而不只是一行。在一些最受欢迎的应用中,您可以应用/m
修饰符。
但是让我再说一遍:请使用HTML解析器。每当有人使用正则表达式解析HTML时,一只小猫就会死...
答案 1 :(得分:1)
取决于您正在使用的语言。 例如,在perl中,您将使用正则表达式修饰符s:
m{<div id="super_special">.*?</span>}s
答案 2 :(得分:1)
您使用的是哪种语言?在.NET中,您必须设置一个选项以确保它不是单行。
答案 3 :(得分:1)
取决于语言。如果在python上,你缺少re.S标志,就像这样(删除匹配):
re.compile('<div id="super_special">.*?</div>',re.S).sub(your_html,'')
其他正则表达式实现存在类似的标志,它们被称为“单行”或“多行”或类似的东西。
但是不要使用REGEXPS PARSE HTML 。这是维护地狱的直接途径。使用像Beautiful Soup这样的HTML解析器。检查these links以获取该方向的有用资源。
答案 4 :(得分:1)
问题在于。默认情况下,元字符与换行符不匹配。您必须使用单行修改器来实现此目的。在.NET中,您可以使用RegexOptions.SingleLine作为您正在使用的方法的最后一个参数,也可以直接在模式中使用修饰符,例如:
(?s)(<div id="super_special">.*?</div>)
答案 5 :(得分:1)
大多数语言都有一些方法可以制作。匹配换行符:
一般来说,使用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对于您的正则表达始终是安全的,那么请不要让我阻止您(尽管如此,您应该认为两次关于将你的未来从潜在的调试问题中解脱出来。)
答案 6 :(得分:1)
开箱即用,没有特殊修饰符,大多数正则表达式实现都不会超出行尾以匹配文本。您可能应该查看正在使用此类修饰符的正则表达式引擎的文档。
我有另外一条建议:提防贪婪!传统上,正则表达式是贪婪,这意味着你的正则表达式可能会匹配这个:
<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>
你应该检查一个“非贪婪”的修饰符,这样你的正则表达式就会在</div>
的第一次出现时停止匹配文字,而不是最后一次强>一个。
另外,正如其他人所说,考虑使用HTML解析器而不是正则表达式。它会为你节省很多麻烦。
编辑:即使非贪婪的正则表达式也不会按预期工作,如果<div>
是嵌套的!考虑使用HTML解析器的另一个原因。
答案 7 :(得分:0)
。 (点)匹配除换行符\ r和\ n之外的任何单个字符。大多数正则表达式都可以选择使点匹配行中断字符。 。匹配x或(几乎)任何其他字符
答案 8 :(得分:0)
也许:。 [\ r \ n] 。 [\ r \ n]
答案 9 :(得分:0)
这些正则表达式建议都不起作用。根据他们是否贪婪,他们将匹配最后一个&lt; / div&gt;在文档中,或第一个&lt; / div&gt;在您的起始字符串之后,可能是嵌入您感兴趣的字符串中的div。
正则表达式实际上不是用于此目的的理想工具,但是如果您的情况非常简单以至于您不想真正解析HTML,则可以使用Microsoft专有的扩展来实现.NET中的正则表达式。 。有关一个很好的解释,请参阅this nice article by Morten Maate。
答案 10 :(得分:0)
单独的正则表达式根本不足以解决您的问题。你需要更强大的东西,比如无上下文的语法。请参阅维基百科的Chomsky hierarchy。
换句话说(如前所述),不要使用正则表达式来解析HTML。