Отказ от балансирующей группы в жадном повторении может вызвать дисбаланс?
В качестве общего примера для решения этого вопроса я намерен сопоставить некоторое число a
S, то равное количество 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, включая совместимость с приложениями, которые принимают решения на основе версии платформы.