Отказ от балансирующей группы в жадном повторении может вызвать дисбаланс?

В качестве общего примера для решения этого вопроса я намерен сопоставить некоторое число aS, то равное количество bплюс еще один b,

Изучите два шаблона, представленные в этом фрагменте ( также на ideone.com):

var r1 = new Regex(@"(?xn)
   (?<A> a)+   (?<B-A> b)+    (?(A)(?!))   b
");
var r2 = new Regex(@"(?xn)
   (?<A> a)+   (?<B-A> b)+?   (?(A)(?!))   b
");

Console.WriteLine(r1.Match("aaabbb"));
// aaabbb

Console.WriteLine(r2.Match("aaabbb"));
// aabbb

Обратите внимание, что есть разница в совпадениях двух шаблонов. r1, который использует жадное повторение в конструкции балансирующей группы, соответствует 3 aи 3 bэто не так, как задумано. r2, который использует неохотное повторение, дает мне 2 aи 3 bЭто то, что намечено.

Единственный способ объяснить это то, что когда (?<B-A> b)+ отступы, чтобы соответствовать одному меньше bэто всплывает из B стек, но не отталкивает то, что было соответственно извлечено из A стек. Таким образом, хотя на один меньше b в настоящее время соответствует A стек остается пустым. Это единственный способ объяснить, как r1 может соответствовать aaabbb,

Обратите внимание, что использование неохотно +? в r2 не вызывает этой проблемы. На мой взгляд, это потому, что в отличие от жадного повторения, неохотное повторение не должно "устранять ущерб" A стек, так сказать. Напротив, жадное повторение наносит как можно больше "урона", но возвращение назад не "оставляет вещи такими, какими они были", A стек.

Это правильный анализ того, что произошло? И если так, это поведение по замыслу? Потому что для меня это в основном похоже на то, что возвращение балансирующей группы в жадном повторении может привести к дисбалансу, и, таким образом, это может быть отнесено к категории ошибок (или, по крайней мере, несколько удивительное поведение, которое недостаточно документировано).

1 ответ

Это ошибка в моно.

Причина, по которой люди становятся похожими на.NET Environment.Version на IdeOne Mono требование обратной совместимости с.NET, включая совместимость с приложениями, которые принимают решения на основе версии платформы.

Другие вопросы по тегам