.NET中的懒惰正则表达式匹配。这有什么不对?

时间:2010-06-28 02:35:10

标签: c# .net regex lookahead lookbehind

在以下示例中,我想检索 pMAINp和第一个 pMDSp之间的文本。正则表达式具有后瞻性和前瞻性:

string contents = "pMAINp MAP B FlightTest Load pMDSp ZutiCarrier pWingp some pMDSp more pWingp end";
string blockMainRegex = @"(?<=pMAINp)[\s\w+]+(?=(pMDS)?)";

我希望的结果是: “MAP B FlightTest Load”

但它返回的是: “MAP B FlightTest加载pMDSp ZutiCarrier pWingp一些pMDSp更多pWingp结束”

你会注意到我在这里尝试一场懒人比赛:(pMDS)?这显然不起作用! 任何有关这方面的帮助将非常感激。谢谢。 : - )

编辑:哎呀,搜索到的文字已经更正。

这很有效:
    string blockMainRegex = @“(?&lt; = pMAINp)[\ s \ w +] +?(?= pMDS)”;

2 个答案:

答案 0 :(得分:3)

  

你会注意到我在这里尝试一场懒人比赛:(pMDS)?这显然不起作用!

你似乎误解了懒惰匹配是如何工作的。

您将延迟运算符应用于量词 - *,+ ,?等等 - 在任何其他地方,它被解释为“零或一”。

如果您希望正则表达式的一部分匹配尽可能少的字符,请将延迟运算符应用于与正则表达式部分关联的量词 - 在这种情况下,您要使用它像这样:

[\s\w+]+?

答案 1 :(得分:1)

string blockMainRegex = @"pMAINp(.*?)pMDSp";

第一组将拥有您想要的。 E.g:

Regex re = new Regex(@"pMAINp(.*?)pMDSp");
string result = re.Match(contents).Groups[1].ToString();