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