C++正则表达式用于重叠匹配

5

我是一名可以帮助翻译文本的助手。

我有一个字符串 'CCCC',想要在其中匹配重叠的 'CCC'。

我的代码:

...
std::string input_seq = "CCCC";
std::regex re("CCC");
std::sregex_iterator next(input_seq.begin(), input_seq.end(), re);
std::sregex_iterator end;
while (next != end) {
    std::smatch match = *next;
    std::cout << match.str() << "\t" << "\t" << match.position() << "\t" << "\n";
    next++;
}
...

然而,这只返回了:
CCC 0 

同时跳过了我所需的CCC 1解决方案。

我了解到非贪婪匹配的'?',但是我无法使其正常工作。

1个回答

8
您的正则表达式可以放置在捕获括号中,并用正向前瞻包装。为了使其在Mac也能正常工作,请确保正则表达式每次匹配(因此可以“消耗”)一个单个字符,并在前瞻后加上一个“.”(或连字符,以同时匹配换行符)。然后,您需要修改代码来获取第一个捕获组的值,方法如下:
#include <iostream>
#include <regex>
#include <string>
using namespace std;

int main() {
    std::string input_seq = "CCCC";
    std::regex re("(?=(CCC))."); // <-- PATTERN MODIFICATION
    std::sregex_iterator next(input_seq.begin(), input_seq.end(), re);
    std::sregex_iterator end;
    while (next != end) {
        std::smatch match = *next;
        std::cout << match.str(1) << "\t" << "\t" << match.position() << "\t" << "\n"; // <-- SEE HERE
        next++;
    }
    return 0;
}

请查看C++演示 输出:
CCC     0   
CCC     1   

谢谢,问题已解决。我会尽快标记为已解决。 - Gábor Erdős
这会在苹果clang上导致无限循环。 - Richard Hodges
@RichardHodges:这可能与这个有关:Mac实现不能有效地处理空匹配。在前瞻后面添加一个.可能会解决问题:std::regex re("(?=(CCC)).");。如果必须匹配换行符,则应将.替换为[\s\S] - Wiktor Stribiżew
确认一下 - 这个在Mac上可以工作:"(?=(CCC))." 你可能需要编辑答案。 - Richard Hodges

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接