regex — C ++ разбивает строку по разделителям и сохраняет разделители в результате

Я ищу способ разделения строки по нескольким разделителям, используя регулярное выражение в C ++, но без потери разделителей в выводе, сохраняя разделители с разделенными частями по порядку, например:

вход

ааа, bbb.ccc, ддд-еее;

Выход

А-а-а, BBB. ccc, ddd — eee;

Я нашел некоторые решения для этого, но все в C # или Java, в поисках решения C ++, желательно без использования Boost.

3

Решение

Вы можете построить свое решение поверх примера для regex_iterator. Например, если вы знаете, что ваши разделители — это запятая, точка, точка с запятой и дефис, вы можете использовать регулярное выражение, которое захватывает разделитель или серию не разделителей:

([.,;-]|[^.,;-]+)

Вставьте это в пример кода, и вы получите что-то вроде этого:

#include <iostream>
#include <string>
#include <regex>

int main ()
{
// the following two lines are edited; the remainder are directly from the reference.
std::string s ("aaa,bbb.ccc,ddd-eee;");
std::regex e ("([.,;-]|[^.,;-]+)");   // matches delimiters or consecutive non-delimiters

std::regex_iterator<std::string::iterator> rit ( s.begin(), s.end(), e );
std::regex_iterator<std::string::iterator> rend;

while (rit!=rend) {
std::cout << rit->str() << std::endl;
++rit;
}

return 0;
}

Попробуйте заменить любые другие регулярные выражения, которые вам нравятся.

10

Другие решения

Для вашего случая, разделив входную строку по границе слова \b кроме того, что в первом даст вам желаемый результат.

(?!^)\b

DEMO

ИЛИ ЖЕ

(?<=\W)(?!$)|(?!^)(?=\W)

DEMO

  • (?<=\W)(?!$) Соответствует границам, которые существуют рядом с несловесным символом, но не границам, присутствующим в конце.

  • | ИЛИ ЖЕ

  • (?!^)(?=\W) Соответствует границе, за которой следует не состоящий из слов символ, кроме того, который находится в начале.

Избегайте обратной косой черты еще раз, если это необходимо.

3

По вопросам рекламы [email protected]