我们如何使用c ++中的regex打印出字符串中的三位数字?

时间:2017-06-22 10:44:25

标签: regex string

示例输入

abc55def789KK23GOOD9999910ONEM109ORE19k6

输出

789 109 

示例输入

abcdef

输出

-1

这是我需要通过正则表达式代码实现的。

我经历了很多网站的教程,但无法根据需要对其进行解读。

我的想法是使用这个正则表达式

rx("[0-9][0-9][0-9]""\\-""[0-5][0-5]")

但是我无法理解smatch标志以及如何检索结果。

1 个答案:

答案 0 :(得分:1)

这是sample C++ demo,显示如何提取未包含其他数字的3位数字块:

#include <string>
#include <iostream>
#include <regex>
using namespace std;

int main() {
    std::regex r(R"((?:^|\D)(\d{3})(?!\d))");
    std::string s = "abc55def789KK23GOOD9999910ONEM109ORE19k6"; // "abcsd"; => Not Found
    if (regex_search(s, r)) {
        for(std::sregex_iterator i = std::sregex_iterator(s.begin(), s.end(), r);
                                 i != std::sregex_iterator();
                                 ++i)
        {
            std::smatch m = *i;
            std::cout << m[1].str() << '\n';
        }
    } else {
        std::cout << "Not found" << '\n';
    }
    return 0;
}

请参阅regex demo。模式匹配:

  • (?:^|\D) - 一个字符串或任何非数字的开头((?:...)是一个非捕获组,它使用与其模式匹配的文本 - 我们必须使用它,因为C ++ {{ 1}}不支持lookbehinds - 因此以下提取组(std::regex)的ID为(\d{3}),而不是1
  • 2 - 第1组:任意3位数
  • (\d{3}) - 捕获的3位数字不应跟随数字(此(?!\d)否定前瞻,用于检查模式是否立即匹配到当前位置,而不将匹配的文本放入匹配中。)

(?!...)用于访问捕获到第1组的值。