[英]Regex for Specific Tag
我正在.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>
我想.
应该得到所有的角色,但它似乎有回车的麻烦。 我的正则表达式遗失了什么?
谢谢。
拜托,拜托,帮自己一个大忙 :使用HTML解析器解析HTML。 认真。 这就是他们的目的。
HTML是一种非常复杂的语言。 无论你将多长时间调整,摆弄,修复,磨练你的Regexp, 总会有一个你想念的案例。
无论如何,你必须告诉你的Regexp引擎匹配多行,而不只是一行。 在一些最流行的应用中,您可以通过应用/m
修饰符来实现。
但请允许我再说一遍: 请使用HTML解析器。 每当有人使用正则表达式解析HTML时,小猫就会死...
取决于您正在使用的语言。例如,在perl中,您将使用正则表达式修饰符:
m{<div id="super_special">.*?</span>}s
你用的是什么语言? 在.NET中,您必须设置一个选项以确保它不是单行。
问题是,。 默认情况下,元字符与换行符不匹配。 您必须使用单行修改器来实现此目的。 在.NET中,您可以使用RegexOptions.SingleLine作为您正在使用的方法的最后一个参数,或者直接在模式中使用修饰符,例如:
(?s)(<div id="super_special">.*?</div>)
大多数语言都有一些方法可以制作。 匹配换行符:
一般来说,使用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>
你应该检查一个“非贪婪”的修饰符,这样你的正则表达式会在第一次出现</div>
停止匹配文本,而不是在最后一次出现时。
此外,正如其他人所说,考虑使用HTML解析器而不是正则表达式。 它会为你省去很多麻烦。
编辑:如果<div>
s嵌套,即使非贪婪的正则表达也不会按预期工作! 考虑使用HTML解析器的另一个原因。
单独的正则表达式根本不足以解决您的问题。 你需要更强大的东西,比如无上下文的语法。 请参阅Wikipedia上的Chomsky层次结构 。
换句话说(如前所述),不要使用正则表达式来解析HTML。
。 (点)匹配除换行符\\ r和\\ n之外的任何单个字符。 大多数正则表达式都可以选择使点匹配行中断字符。 。 匹配x或(几乎)任何其他字符
也许: 。 [\\ r \\ n] 。 [\\ r \\ n]的
这些正则表达式建议都不起作用。 根据它们是否贪婪,它们将匹配文档中的最后一个</ div>,或者匹配起始字符串后面的第一个</ div>,它可能是一个嵌套在您的文本中的div。有兴趣。
正则表达式实际上不是用于此目的的理想工具,但是如果您的情况很简单以至于您不想真正解析HTML,则可以使用.NET专有的Microsoft专有扩展来实现此目的。 有关一个很好的解释,请参阅Morten Maate撰写的这篇精彩文章 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.