Я пытаюсь проанализировать входную строку с помощью регулярного выражения. Я получаю проблему при попытке получить повторяющуюся группу. Я всегда, кажется, соответствую последнему экземпляру группы. Я попытался использовать Отказывающийся (не жадный) кванторы, но я, кажется, пропускаю что-то. Кто-то может помочь?
Регулярное выражение попробовало:
(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 раза в этом примере. Любая справка будет очень цениться.
Единственный известный мне regex, который может дать вам все итерации группы захвата - это .NET regex. Обычно механизм regex сохраняет только последнюю итерацию каждой группы захвата.
Общее решение такой проблемы - использовать один regex для захвата всех итераций группы, а второй regex для разделения результата первого regex на отдельные элементы. Алан уже объяснил, как это можно сделать в данной конкретной ситуации.
Это ожидаемое поведение: когда группа захвата управляется квантификатором, каждое повторение перезаписывает все, что было захвачено в предыдущий раз. Самый простой способ получить все совпадения - создать группу захвата вокруг всего объекта, например:
(OS)\\s(((\\w{3})(([A-Za-z0-9]{2})|(\\w{3})(\\w{3}))\\/?){1,5})\\r
В конечном итоге эта группа будет содержать BENKL / LHRBA / MANQFL
, которые вы можете разделить на /
.