2012-03-12 58 views
2

我想循環使用正則表達式測試的字符串,以及是否無法輸出字符串其餘部分失敗的位置。在字符串上循環查看字符串失敗的位置

boost::regex const string_matcher("[0-9]{5}"); 
if (boost::regex_match(12A45,string_matcher)) 
{ 
    DCS_LOG_DEBUG("Correct\n");      
} 
else 
{ 
    DCS_LOG_DEBUG("Incorrect\n"); 
} 

所以從這個輸出是

"A45" 
+0

一般來說,這是無法回答的。如果你有正則表達式'(a.b)|(ac [de])',匹配的'aee'在位置3(不是'b')或位置2(不是'c')失敗。正則表達式引擎在一種可能性不能解決時回退,這是一個二元決定。它不會記錄「它有多遠」。因此,我的示例中的數字「3」未被存儲。 – MSalters 2012-03-12 16:34:22

回答

1

你會使用這樣的:

(^[0-9]{5}$)|^(?:[0-9]{0,5})(.*)$ 

有兩個捕獲和非捕獲組(一個在(?:...)

第一個是「正確」的數據。該字符串由5位數字組成。否則將跳過0-5位數字,並將第一個「錯誤」字符放入第二個捕獲(.?)。請注意,即使字符串爲空,該捕獲也會成功。

小樣本:

std::regex const string_matcher("(^[0-9]{5}$)|^(?:[0-9]{0,5})(.*)$"); 
std::match_results<std::string::const_iterator> match; 
std::string str("123456"); 

std::cout << "Success: " << std::boolalpha << std::regex_match(str, match, string_matcher) << std::endl; 
std::cout << "Num of sub-matches: " << match.size() << std::endl; 
std::cout << "Success capture: " << std::boolalpha << match[1].matched << " at " << match.position(1) << ": '" << match[1].str() << "'" << std::endl; 
std::cout << "First failed character: " << std::boolalpha << match[2].matched << " at " << match.position(2) << ": '" << match[2].str() << "'" << std::endl; 

(可惜我不能編譯它ideone,因爲它不支持正則表達式,在VC++測試)

測試它:

(empty string) 
1 
AA 
1AA 
12345 
123456 
12345AA 
+0

好吧,正則表達式...'boost :: regex const string_matcher(「(?^[0-9] {5} $)| ^(?:[0-9] {0,5})( ?。)$「);'或者成功與失敗某種'串'? – CodersSC 2012-03-12 10:00:00

+0

@ShamariCampbell添加了一個新段落 – xanatos 2012-03-12 10:15:25

+0

噢好吧我現在看到是的謝謝你的男人! – CodersSC 2012-03-12 13:02:03

1

你可以做的是:

遍歷您的字符串的字符,而當結果是循環不正確,使用indexof(chr)打印結果,其中chr是當前正在循環中的字符,然後退出循環。

+0

所以,你的意思是,當它在字符串上的錯誤循環時,我想我明白你對indexof的理解,但是如何找到它在失敗時會混淆的地方@Alilssa – CodersSC 2012-03-12 09:51:06

+0

當你循環並且你的代碼進入else語句時, (my_string [i])中的C++ char將成爲不正確值的聊天,因此通過獲取此char的索引,您可以知道它停止的位置,然後在此特定char的索引上對字符串進行子串處理。 – 2012-03-12 09:59:31