Regex в C ++ для извлечения из выражения regex строки в любой части текста - PullRequest
1 голос
/ 22 марта 2012

Пример:

вот строка: "blablabla123:550:404:487blablabla500:488:474:401blablablabla"

вот что я использую:

string reg = "(\\d{1,3}):(\\d{1,3}):(\\d{1,3}):(\\d{1,3})";

это, очевидно, не работает, так как ищет начало с числа, и я также хочу получить все результаты, но я не знаю, как это сделать, хотя я так сильно искал это. : /

Я хочу иметь 2 массива с:

Массив 1: должен возвращать [1] = "123"; [2] = "550"; [3] = "404"; [4] = "487";
Массив 2: должен возвращать [1] = "500"; [2] = "488"; [3] = "474"; [4] = "401";

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

#include <conio.h>
using namespace std;

typedef std::tr1::match_results<std::string::const_iterator> str_iterator;
int main () {
    str_iterator res;

string regex = "(\\d{1,3}):(\\d{1,3}):(\\d{1,3}):(\\d{1,3})";
string str = "blablabla123:550:404:487blablabla500:488:474:401blablablabla";
const std::tr1::regex pattern(regex.c_str());
bool valid = std::tr1::regex_match(str, res, pattern);
//res is gonna be an array with the match results
if(valid){
    printf("Matched with size of %d\n", res.size());
    printf("Result 1: %s",res[1]);
    printf("Result 2: %s",res[2]);
    printf("Result 3: %s",res[3]);
    printf("Result 4: %s",res[4]);
}else{
    printf("Not Matched");
}
_getch();
return 0;
}

Ответы [ 2 ]

1 голос
/ 22 марта 2012

regex_match будет пытаться соответствовать строке всей .Очевидно, в вашем случае результат будет ложным (он не будет совпадать).

Попробуйте вместо этого использовать regex_search.

0 голосов
/ 22 марта 2012

Что по этому поводу:

[^\d]*(\d+)[^\d]+(\d+)[^\d]+(\d+)[^\d]+(\d+)[^\d]+(\d+)[^\d]+(\d+)[^\d]+(\d+)[^\d]+(\d+)[^\d]*

Это ужасно, но мы получим 8 чисел, разделенных любыми другими символами.

group(0)    group(1)    group(2)    group(3)    group(4)    group(5)    group(6)    group(7)    
123           550         404         487         500         488           474         401

В противном случае вы можете изменить строку, заменив каждую не цифру на :, что даст вам: :::::::::123:550:404:487:::::::::500:488:474:401:::::::::::: Вы просто сохраняете непустые значения, анализируя строку. Но это сработает, только если вы уверены, что не будете иметь пустых значений

...