Как делают я получаю все соответствия повторяющейся группы с Повышением:: regex_search?

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

Регулярное выражение попробовало:

(OS)\\s((\\w{3})(([A-Za-z0-9]{2})|(\\w{3})(\\w{3}))\\/{0,1}){1,5}?\\r

(OS)\\s((\\w{3}?)(([A-Za-z0-9]{2}?)|(\\w{3}?)(\\w{3}?))\\/{0,1}?){1,5}?\\r

Входная строка:

OS BENKL/LHRBA/MANQFL\r\n

Я всегда, кажется, получаю последнюю группу, которая является группой MANQFL (MAN QFL), и моя цель состоит в том, чтобы получить все три группы (может быть 1-5 групп):

(BEN KL) , (LHR BA) and (MAN QFL). 

Фрагмент кода C++:

std::string::const_iterator start = str.begin(), end = str.end(); 
while(regex_search(start,end,what,expr)) 
{ 
  cout << what[0]; 
  cout << what[1]; 
  ... 
  start += what.position () + what.length (); 
}

Этот цикл только exceutes однажды, в то время как я ожидаю, что это будет работать 3 раза в этом примере. Любая справка будет очень цениться.

5
задан Rob Kennedy 28 June 2010 в 15:39
поделиться

2 ответа

Единственный известный мне regex, который может дать вам все итерации группы захвата - это .NET regex. Обычно механизм regex сохраняет только последнюю итерацию каждой группы захвата.

Общее решение такой проблемы - использовать один regex для захвата всех итераций группы, а второй regex для разделения результата первого regex на отдельные элементы. Алан уже объяснил, как это можно сделать в данной конкретной ситуации.

1
ответ дан 14 December 2019 в 18:56
поделиться

Это ожидаемое поведение: когда группа захвата управляется квантификатором, каждое повторение перезаписывает все, что было захвачено в предыдущий раз. Самый простой способ получить все совпадения - создать группу захвата вокруг всего объекта, например:

(OS)\\s(((\\w{3})(([A-Za-z0-9]{2})|(\\w{3})(\\w{3}))\\/?){1,5})\\r

В конечном итоге эта группа будет содержать BENKL / LHRBA / MANQFL , которые вы можете разделить на / .

0
ответ дан 14 December 2019 в 18:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: