循环遍历字符串以查看字符串失败的位置

时间:2012-03-12 09:35:17

标签: c++ regex string boost

我希望能够循环遍历正在对正则表达式进行测试的字符串,如果它无法输出失败的字符串的其余部分。

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"

2 个答案:

答案 0 :(得分:1)

你能做的是:

循环遍历字符串的字符,并在结果不正确时循环,使用indexof(chr)打印结果,其中chr是现在在循环中的字符,然后退出循环。

答案 1 :(得分: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