3

在以下示例中,我想检索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 Load pMDSp ZutiCarrier pWingp some pMDSp more pWingp end”

你会注意到我在这里尝试了一个惰性匹配:(pMDS)?这显然是行不通的!对此的任何帮助将不胜感激。谢谢。:-)

编辑:哎呀,寻求的文本已被更正。

这很好用:
string blockMainRegex = @"(?<=pMAINp)[\s\w+]+?(?=pMDS)";

4

2 回答 2

3

你会注意到我在这里尝试了一个惰性匹配:(pMDS)?这显然是行不通的!

您似乎误解了惰性匹配的工作原理。

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

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

[\s\w+]+?
于 2010-06-28T02:42:15.903 回答
1
string blockMainRegex = @"pMAINp(.*?)pMDSp";

第一组将有你想要的。例如:

Regex re = new Regex(@"pMAINp(.*?)pMDSp");
string result = re.Match(contents).Groups[1].ToString();
于 2010-06-28T02:41:37.233 回答