正则表达式<= />常规语言?

问题描述

| 据我所知,一个正则表达式等效于一个有限自动机(读取一个符号,然后过渡到下一个状态) 相比之下,这种正则表达式在c#中可以正常工作吗?
var input = \"bla bla bla bla  <I NEED THIS TEXT>\";
Match match = Regex.Match(input,@\"<(.*)>\");
因为机器必须保持在“。”状态,所以不管发生什么,不是吗? 我认为正确的正则表达式如下:
Match match = Regex.Match(input,@\"<([^>]*)>\");
但两者都可以。     

解决方法

        回溯:http://msdn.microsoft.com/en-us/library/dsy130b4.aspx。 使用以下代码时:
Match match = Regex.Match(input,@\"<(.*)>\");
正则表达式引擎解析输入字符串中的所有字符(并将\“> \”解析为\“。* \”匹配项),但找不到任何匹配项。然后,它以一个符号(最后一个\“> \”)返回,并尝试将其解析为模式中的\“> \”。而且-它匹配!因此,它返回正确的字符串。     ,        查看在以下情况下执行的这些正则表达式: 1。
bla bla bla bla  <I NEED THIS TEXT> bla bla bla <I need this text>
在这里,第一个正则表达式一次匹配所有“ 4”,而不关心两个\“ tags \”之间是否有文本。 第二个正则表达式将分别匹配
<I NEED THIS TEXT>
<I need this text>
。万岁。但是现在来看这个: 2。
bla bla bla bla  <I NEED <something nested in> THIS TEXT>
现在正则表达式1匹配
<I NEED <something nested in> THIS TEXT>
,正则表达式2匹配
<I NEED <something nested in>
。哎呀 现在来看这个: 3。
<I NEED THIS TEXT \"containing an attribute with \">\" in it>
正则表达式1匹配所有; regex 2匹配
<I NEED THIS TEXT \"containing an attribute with \">
。 这就是为什么在通常需要递归下降解析器的情况下很难使用正则表达式的原因。 某些现代的regex样式确实支持任意递归嵌套,但即使那样,您也可能会因为文字字符串,注释,嵌入式脚本以及HTML / XML中的诸如此类(可能是这个问题)结束,不是吗?)...     ,        您是正确的,对于您的示例而言,天真的正则表达式实现不起作用。但是,许多引擎都实现了回溯,这使它们可以到达输入字符串的末尾,确定未进行匹配,然后从末尾开始向后工作,丢弃所有已进行的
.
+
*
匹配过于贪婪,注意
>
字符成功匹配,然后迅速返回成功。 其他引擎实际上并没有实现我所描述的回溯,而是通过更巧妙的机制实现了相同的结果。