使用C++正则表达式提取限定符间数字仅获第一个结果的问题
问题根源
你的正则表达式xxx([0-9]+)yyy限定了xxx和yyy之间必须是连续的纯数字,但第二个目标片段xxxrandomstring2222yyy中,xxx和数字之间夹杂了其他字符,导致正则无法匹配到这个片段,因此只输出了第一个数字。
解决方案
这里提供两种可行的修改方式:
方案一:先匹配完整区块,再提取数字
先捕获xxx到yyy之间的所有内容,再从这段内容里提取数字,适合区块内有多个数字段的场景:
#include <iostream> #include <regex> using namespace std; int main() { string text = "xxx1111yyy xxxrandomstring2222yyy"; string start_delimiter = "xxx"; string end_delimiter = "yyy"; // 匹配xxx到yyy的完整区块,捕获中间内容 regex block_regex(start_delimiter + "(.*?)" + end_delimiter); // 用于提取数字的正则 regex num_regex("[0-9]+"); smatch block_match; while (regex_search(text, block_match, block_regex)) { string block_content = block_match[1].str(); smatch num_match; // 从区块内容中提取所有数字 while (regex_search(block_content, num_match, num_regex)) { cout << num_match[0] << endl; block_content = num_match.suffix().str(); } text = block_match.suffix().str(); } return 0; }
方案二:直接修改正则适配带其他字符的场景
如果每个xxx-yyy区块里只有一个数字段,可以直接调整正则,允许xxx和数字之间存在任意非yyy的字符:
#include <iostream> #include <regex> using namespace std; int main() { string text = "xxx1111yyy xxxrandomstring2222yyy"; string start_delimiter = "xxx"; string end_delimiter = "yyy"; // 非贪婪匹配xxx到yyy之间的内容,捕获其中的数字 regex pattern(start_delimiter + ".*?([0-9]+).*?" + end_delimiter); smatch match; while (regex_search(text, match, pattern)) { cout << match[1] << endl; text = match.suffix().str(); } return 0; }
说明
两种方案都能输出你预期的结果:
1111 2222
方案一的扩展性更强,即使区块内有多个数字(比如xxxabc123def456yyy)也能全部提取;方案二更简洁,适合单个数字的场景。
内容的提问来源于stack exchange,提问作者Villoni Jean pierre
相关产品推荐
相关产品推荐

