Ленивое соответствие регулярных выражений в .NET. Что здесь не так? - PullRequest
3 голосов
/ 28 июня 2010

В следующем примере я хотел бы получить текст между pMAINp и first 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»

, но он возвращает: «MAPB FlightTest Загрузить pMDSp ZutiCarrier pWingp немного pMDSp больше pWingp end "

Вы заметите, что я здесь пытаюсь выполнить ленивое совпадение: (pMDS)?который явно не работает!Любая помощь с этим будет высоко ценится.Благодарю.: -)

EDIT : Ой, искомый текст был исправлен.

Это прекрасно работает:
string blockMainRegex = @ "(? <= PMAINp)[\ s \ ш +] + (= PMDS?) ";? </p>

Ответы [ 2 ]

3 голосов
/ 28 июня 2010

Вы заметите, что я пытаюсь найти ленивый матч здесь: (pMDS)?который явно не работает!

Вы, похоже, неправильно понимаете, как работает ленивое сопоставление.

Вы применяете ленивый оператор к квантификатору - *,+,?и т. д. - где-либо еще, это интерпретируется как «ноль или один».

Если вы хотите, чтобы одна часть регулярного выражения соответствовала как можно меньшему числу символов, примените ленивый оператор к квантификатору, связанномус этой частью регулярного выражения - в этом случае вы хотите использовать его следующим образом:

[\s\w+]+?
1 голос
/ 28 июня 2010
string blockMainRegex = @"pMAINp(.*?)pMDSp";

Первая группа будет иметь то, что вы хотите.Например:

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