2012-03-22 123 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:::::::::::: 你只需通過解析字符串保持非空值。但是,只有當你確定沒有空值時纔會起作用。

相關問題