C ++ регулярное выражение: разбить строку

0

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

|   | | |-DeclRefExpr 0x5d91218 <col:5> 'int' lvalue Var 0x5d91120 'y' 'int'

Теперь я хотел бы разбить это на

|   | | |-DeclRefExpr 0x5d91218 <col:5> 
int
 lvalue Var 0x5d91120 
y

int

Я знаю, что регулярное выражение будет чем-то вроде [^ '] *, но я не могу понять, как я могу это сделать. Я пробовал до сих пор:

#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <regex>

using namespace std;

int main(){

    std::string var = "    |   | | |-DeclRefExpr 0x5d91218 <col:5> 'int' lvalue Var 0x5d91120 'y' 'int'";

    std::regex rgx("[^']*");
    std::smatch match;
    if (std::regex_search(var.begin(), var.end(), match, rgx)){
        cout << match[3] << endl;
    }
    return 0;
}
  • 1
    Что-то вроде [^']*'[^']*'[^']*'[^']*'[^']*'[^']*' плюс захват групп в соответствующих местах?
  • 0
    (. *) '(. *)' (. *) '(. *)'. * '(. *)' соответствует вашему требованию на regexpal.com , std :: regex может вести себя по-другому.
Теги:

2 ответа

4
Лучший ответ

Извините, я не могу проверить этот код, но он может работать.

std::string var = "|   | | |-DeclRefExpr 0x5d91218 <col:5> 'int' lvalue Var 0x5d91120 'y' 'int'";
std::regex wsaq_re("\\s*'|'+\\s*(?!')"); 
std::copy( std::sregex_token_iterator(var.begin(), var.end(), wsaq_re, -1),
    std::sregex_token_iterator(),
    std::ostream_iterator<std::string>(std::cout, "\n"));
  • 0
    Вы можете проверить свой код на Coliru, используя clang и libc ++, например: coliru.stacked-crooked.com/a/f0b5fd383bc227fc
  • 1
    +1 компактный подход!
Показать ещё 1 комментарий
0

Помимо метода @CasimiretHippolyte, вы также можете использовать regex_search():

const regex r("(.*)'(.*)'(.*)'(.*)'(.*)'(.*)'");  
smatch sm;

if (regex_search(var, sm, r))
{
    for (int i=1; i<sm.size(); i++)
    {
        cout << sm[i] << endl;
    }
}

Смотрите это в прямом эфире: http://coliru.stacked-crooked.com/a/494ab2e0f1c5d420

Ещё вопросы

Сообщество Overcoder
Наверх
Меню