首页 > 解决方案 > 正则表达式匹配字符串之间的数字

问题描述

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

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

想要的结果:

123456
654321

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

标准::正则表达式

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

正则表达式

标签: c++regexc++11

解决方案


您可以使用

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

请参阅正则表达式演示

它定义了start:\s*(\d+)\s*end:匹配 , 0+ 个空格的正则表达式模式start:,然后将一个或多个数字捕获到 Group 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());

查看在线 C++ 演示

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


推荐阅读