[英]C# regular expression for finding forms with input tags in HTML?
我有一个简单的问题:我想构造一个与HTML中的表单匹配的正则表达式,但前提是该表单具有任何输入标签。 例:
应匹配以下内容(忽略属性):
..
<form>
..
<input/>
..
</form>
..
但是以下内容不应(忽略属性):
..
<form>
..
</form>
..
我已经尝试了从环顾四周到捕获群组的所有内容,但是很快就变得复杂了。 我想相信有一个简单的正则表达式可以解决问题。 请注意,正则表达式必须根据HTML代码将开始标记和结束标记配对,这意味着以下操作不起作用:
<form>.+<input/>.+</form>
因为它像这样错误地匹配:
..
<form> <--- This is wrongly matched as the opening tag
..
</form>
<form> <-- This is the correct opening tag of the correct form
..
<input/>
..
</form> <--- This is matched as the closing tag
..
编辑:
我已经制作了一个与我想要的匹配的RegEx; 我的问题是现在该怎么做,但是要简单/优雅。 对我来说,这根本不是简单或优雅的:
<form>
(.(?<!</form>))+
<input/>
(.(?<!</form>))+
</form>
我想相信有一个简单的正则表达式可以解决问题
愿望并非如此。 没有任何证据可以证明正则表达式可以解决每个问题,并且有大量证据可以反对。 你的信仰不好。
正则表达式可识别的语言集被称为正则语言,这并不奇怪。 所有常规语言的一个不错的特性是它们可以被具有有限多个状态的设备识别。 因此,您可以快速计算出,如果语言不经常问自己这个问题:“我需要状态的无限数量的认识到这一点的语言?”
考虑匹配括号的语言:(),()(),(()),()(())等。 要识别这种语言,您必须跟踪有多少打开的paren等待关闭,因此您需要无限制的状态数。 因此,该语言不是常规语言,因此无法与正则表达式匹配。
HTML显然是paren语言,但更为复杂,因为现在有无数种不同的“ parens类型”。 每个标签就像一个开放的paren,必须与其相应的结束标签匹配。 由于这是非常规语言的一种更加复杂和困难的版本,因此显然它不能是常规语言。 因此,它不能与正则表达式正确匹配。
识别HTML中的模式的正确工具是HTML解析器。
您真的不想使用RegEx解析HTML。 如果您需要更多定罪,请参阅此答案 。
正则表达式是尝试解析HTML的错误工具-尤其是在HTML格式不正确的情况下。
您应该真正获得一个HTML / XHTML解析库,并使用它来匹配HTML内容。 看一下HTML Agility Pack ,它足够满足您的需求。
您不应该使用正则表达式解析HTML ,但是如果必须,那么简单的事情如下:
<form>[^</form>]+<input/>.+</form>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.