Почему эта попытка использования балансировочных групп в Regex не удалась?

Для строки "1-2-3-4"Я хотел создать регулярное выражение, которое дало бы мне следующие совпадения, то есть каждую соответствующую пару цифр, разделенных 1 или более чертами:

  1. "1-2"
  2. "2-3"
  3. "3-4"

с каждой цифрой в своей собственной группе захвата.

Первая попытка (C# аромат):

(?<first>\d)-+(?<second>\d)

Это дает мне:

  1. "1-2"
  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);

Оставит это как есть, так как он был закрыт как дубликат. И, видимо, я ошибался в использовании балансировочных групп:)

0 ответов

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