正则表达式匹配字符串之间的数字

时间:2018-06-24 13:25:01

标签: c++ regex c++11

我需要从以下文本中提取整数值,介于字符串“ start:”和“ end:”之间,并且仅 之间。

 111222 garbage  999888 start:        123456       end:     start:         654321     end:

想要的结果:

123456
654321

这里是我所拥有的,但是我需要它来排除整数周围未知数量的空格。

std :: regex

(?<=start:)(.*?)(?=end:)

RegExr

3 个答案:

答案 0 :(得分:2)

您可以使用

std::regex reg(R"(start:\s*(\d+)\s*end:)");

请参见regex demo

它定义start:\s*(\d+)\s*end:的正则表达式模式,该模式匹配start:,0+空格,然后捕获到组1中一个或多个数字,然后匹配0+空格和end:子字符串。

请注意,如果无法使用原始字符串文字(R"(...)"表示法),则可以使用常规字符串文字定义模式,其中所有反斜杠都应加倍:"start:\\s*(\\d+)\\s*end:"

要获取所有匹配项,您需要std::sregex_token_iterator,并在获取匹配项时指定需要获取所有第1组值:

const std::regex reg(R"(start:\s*(\d+)\s*end:)");
std::smatch match;
std::string s = "garbage 111222 garbage ... 999888 fewfew... start:        123456       end:     start:         654321     end:";
std::vector<std::string> results(std::sregex_token_iterator(s.begin(), s.end(), reg, 1),
                           std::sregex_token_iterator());

请参见online C++ demo

如果start:end:中可以有任何值,请将\d+替换为.*?(匹配除换行符以外的任何0+字符)。

答案 1 :(得分:1)

要提取start:end:之间的整数而不用后面看,您可以在捕获组中捕获一个或多个数字:

  • 匹配start:后跟零个或多个空白字符\s*
  • (/d+)捕获一组中的一个或多个数字
  • (?=\s*end:)是肯定的lookahead,断言其后是零个或多个空格字符和end:

start:\s*(\d+)(?=\s*end:)

答案 2 :(得分:0)

  

我需要从以下文本中提取整数值,介于字符串“ start:”和“ end:”之间,并且仅 之间。
  111222 garbage 999888 start: 123456 end: start: 654321 end:

您可以使用以下命令:start:\s*([0-9]+)

int main()
{
    std::string str{R"(111222 garbage  999888 start:        123456       end:     start:         654321     end:)"};
    std::regex rgx{R"(start:\s*([0-9]+))"};
    std::smatch matches;

    while (std::regex_search(str, matches, rgx)) {
        std::cout << matches.str(1) << std::endl;
        str = matches.suffix();
    }
}

输出:

123456
654321

Demo