Regexp< = />常规语言?

时间:2011-05-31 10:57:45

标签: c# regex

据我所知,regexp等效于一个有限的自动机(读取一个符号,然后转换到下一个状态)

这怎么可能,这个正则表达式在c#中运行良好?

var input = "bla bla bla bla  <I NEED THIS TEXT>";
Match match = Regex.Match(input, @"<(.*)>");

因为机器必须留在“。”状态,无论发生什么,都不能? 我认为正确的正则表达式如下:

Match match = Regex.Match(input, @"<([^>]*)>");

但两者都很好。

3 个答案:

答案 0 :(得分:4)

回溯:http://msdn.microsoft.com/en-us/library/dsy130b4.aspx。 当您使用以下代码时:

Match match = Regex.Match(input, @"<(.*)>");

正则表达式引擎解析输入字符串中的所有字符(并将“&gt;”解析为“。*”匹配)并且找不到任何匹配项。然后,它返回一个符号(最后一个“&gt;”)并尝试将其解析为“&gt;”在模式中。而且 - 它匹配!所以,它返回正确的字符串。

答案 1 :(得分:1)

在以下情况下查看这些正则表达式:

<强> 1

bla bla bla bla  <I NEED THIS TEXT> bla bla bla <I need this text>

这里第一个正则表达式同时匹配<I NEED THIS TEXT> bla bla bla <I need this text>,并不关心两个“标签”之间是否存在文本。

第二个正则表达式将分别与<I NEED THIS TEXT><I need this text>匹配。万岁。但现在看看这个:

<强> 2

bla bla bla bla  <I NEED <something nested in> THIS TEXT>

现在正则表达式匹配<I NEED <something nested in> THIS TEXT>和正则表达式匹配<I NEED <something nested in>。糟糕。

现在看看:

第3

<I NEED THIS TEXT "containing an attribute with ">" in it>

正则表达式1匹配所有;正则表达式2匹配<I NEED THIS TEXT "containing an attribute with ">

这就是为什么在你通常需要递归下降解析器的情况下正则表达式很难。

一些现代的正则表达式支持任意递归嵌套,但即使这样,你也需要在脚趾上,因为文字字符串,注释,嵌入式脚本以及诸如HTML / XML之类的东西等等(这可能就是这个问题所在的最后,不是吗?)...

答案 2 :(得分:0)

你是对的,正则表达式的天真实现对你的例子不起作用。但是,许多引擎实现backtracking,允许它们到达输入字符串的末尾,确定没有进行匹配,然后从最后开始向后,丢弃任何已过于贪婪的.+*匹配,请注意>字符成功匹配,并快速返回成功。

其他引擎实际上并没有像我所描述的那样实现回溯,而是通过更聪明的机制达到相同的结果。