sregex_token_iterator почти идеально работает в качестве токенизатора, если для индекса подматрицы задано значение -1. Но, к сожалению, он плохо работает со строками, начинающимися с разделителей, например:
#include <string>
#include <regex>
#include <iostream>
using namespace std;
int main()
{
string s("--aa---b-c--d--");
regex r("-+");
for (sregex_token_iterator it = sregex_token_iterator(s.begin(), s.end(), r, -1); it != sregex_token_iterator(); ++it)
{
cout << (string) *it << endl;
}
return 0;
}
распечатывает:
aa
b
c
d
(обратите внимание на начальную пустую строку).
Итак, обратите внимание, что на самом деле он хорошо обрабатывает конечные разделители (так как не выводит лишнюю пустую строку).
Считая стандарт, кажется, есть пункт для специальной работы с конечным разделителем, т.е.:
[re.tokiter] no 4.
Если достигнут конец последовательности (позиция равна концу итератора последовательности), итератор становится равным значению итератора конца последовательности, если только перечисляемое подвыражение не имеет индекса -1, в котором case итератор перечисляет одно последнее подвыражение, которое содержит все символы с конца последнего регулярного выражения, совпадающего с концом перечисляемой входной последовательности, при условии, что это
не будет пустым подвыражением.
Кто-нибудь знает, в чем причина указанного, казалось бы, асимметричного поведения?
И, наконец, есть ли элегантное решение для этой работы? (так что у нас нет пустых записей вообще).