用于在HTML中查找带有输入标记的表单的C#正则表达式?

joh*_*nrl 1 html c# regex forms

我有一个简单的问题:我想构建一个与HTML中的表单匹配的正则表达式,但前提是表单有任何输入标记.例:

应匹配以下内容(忽略属性):

..
<form>
..
<input/>
..
</form>
..
Run Code Online (Sandbox Code Playgroud)

但以下不应该(忽略属性):

..
<form>
..
</form>
..
Run Code Online (Sandbox Code Playgroud)

我已经尝试了从外观到捕获组的所有内容,但它很快变得复杂.我想相信有一个简单的正则表达式来捕捉问题.请注意,正则表达式必须根据HTML代码对开始和结束标记进行配对,这意味着以下操作不起作用:

<form>.+<input/>.+</form>
Run Code Online (Sandbox Code Playgroud)

因为它错误匹配如下:

..
<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
..
Run Code Online (Sandbox Code Playgroud)

编辑:

我已经制作了符合我想要的RegEx; 我的问题是现在该怎么做,但如何做到简单/优雅.对我来说,这根本不简单或优雅:

<form>
(.(?<!</form>))+
<input/>
(.(?<!</form>))+
</form>
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 5

我想相信有一个简单的正则表达式来捕捉问题

许愿不是这样.没有证据表明每个问题都可以通过正则表达式解决,而且有大量证据可以证明.你的信仰不是很好.

正则表达式可识别的语言集合 - 不出所料 - 被称为常规语言.所有常规语言的一个很好的特性是它们可以被具有有限多个状态的设备识别.因此,您可以通过问自己"我是否需要无限数量的州来识别这种语言?" 来快速弄清楚语言是否规律?

考虑匹配parens的语言:(),()(),(()),()(())等.要识别这种语言,你必须跟踪有多少打开的parens等待关闭,因此你需要一个无限数量的状态.因此,该语言不是常规语言,因此无法通过正则表达式进行匹配.

HTML显然是paren语言,但更复杂,因为现在有无数种不同的"parens".每个标记都像一个开放的paren,必须与其对应的结束标记匹配.由于这是非常规语言的更复杂和困难的版本,显然它不能成为常规语言.因此它无法与正则表达式正确匹配.

识别HTML中模式的正确工具是HTML解析器.