示例输入
abc55def789KK23GOOD9999910ONEM109ORE19k6
输出
789 109
示例输入
abcdef
输出
-1
这是我需要通过正则表达式代码实现的。
我经历了很多网站的教程,但无法根据需要对其进行解读。
我的想法是使用这个正则表达式
rx("[0-9][0-9][0-9]""\\-""[0-5][0-5]")
但是我无法理解smatch
标志以及如何检索结果。
答案 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组的值。