Почему эта попытка использования балансировочных групп в Regex не удалась?
Для строки "1-2-3-4"
Я хотел создать регулярное выражение, которое дало бы мне следующие совпадения, то есть каждую соответствующую пару цифр, разделенных 1 или более чертами:
"1-2"
"2-3"
"3-4"
с каждой цифрой в своей собственной группе захвата.
Первая попытка (C# аромат):
(?<first>\d)-+(?<second>\d)
Это дает мне:
"1-2"
"3-4"
Очевидно, что в момент получения первого совпадения я использовал цифру "2"
и поэтому следующий символ, который нужно сопоставить, - это тире после "2"
,
Затем я закончил читать мои C#-/Regex-навыки и наткнулся на группы балансировки, войдя в свое упрямство. Как я понял, это должно сделать это (но это не так):
(?<entire>(?:(?<first-entire>\k<entire>)|(?<first>\d))-+(?<second>\d))
Это дает тот же результат, что и моя первая попытка. Я бы ожидал <first-entire>
вещь перемотает снимки к предыдущему совпадению (если есть), делая \k<entire>
часть теперь соответствует всему предыдущему совпадению (которое после 1 итерации будет "1-2"
), или - если первая итерация - вернуться к <first>\d
шаблон.
Что я неправильно понял?
Обновление: Вероятно, следовало бы точно объяснить, что я собирался сделать - но намекнул комментатор, что нашел решение для моей цели, состоящей в том, чтобы убрать все тире (1 или более), которые могут встречаться между цифрами. Решено с более простым положительным прогнозом, как:
Regex _stripTheDashes = new Regex(@"(?<digit>\d)-+(?=\d)", RegexOptions.Compiled);
var stripped = _stripTheDashes.Replace(s, m => m.Groups["digit"].Value);
Оставит это как есть, так как он был закрыт как дубликат. И, видимо, я ошибался в использовании балансировочных групп:)