2012-03-22 90 views
1

例子:正则表达式在C++中从正则表达式的字符串文本的任何部分获取

这里是字符串:"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; 
} 

回答

1

regex_match将尝试匹配整个字符串。显然在你的情况下,结果将是错误的(它不会匹配)。

尝试使用regex_search代替。

+0

是的,这听起来是正确的,我希望你已经解释了如何使用regex_search来做到这一点,但既然你没有,它应该是另一个话题,所以在这里,我希望你能回答:http:///stackoverflow.com/questions/9823367/regex-fetching-various-results-with-regex-search – Grego 2012-03-22 13:37:41

-1

这个怎么样:

[^\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:::::::::::: 你只需通过解析字符串保持非空值。但是,只有当你确定没有空值时才会起作用。

相关问题