在以下示例中,我想检索 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)”;
答案 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();