Я ищу способ разделения строки по нескольким разделителям, используя регулярное выражение в C ++, но без потери разделителей в выводе, сохраняя разделители с разделенными частями по порядку, например:
вход
ааа, bbb.ccc, ддд-еее;
Выход
А-а-а, BBB. ccc, ddd — eee;
Я нашел некоторые решения для этого, но все в C # или Java, в поисках решения C ++, желательно без использования Boost.
Вы можете построить свое решение поверх примера для 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;
}
Попробуйте заменить любые другие регулярные выражения, которые вам нравятся.
Для вашего случая, разделив входную строку по границе слова \b
кроме того, что в первом даст вам желаемый результат.
(?!^)\b
ИЛИ ЖЕ
(?<=\W)(?!$)|(?!^)(?=\W)
(?<=\W)(?!$)
Соответствует границам, которые существуют рядом с несловесным символом, но не границам, присутствующим в конце.
|
ИЛИ ЖЕ
(?!^)(?=\W)
Соответствует границе, за которой следует не состоящий из слов символ, кроме того, который находится в начале.
Избегайте обратной косой черты еще раз, если это необходимо.