You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 17:05:20