C++ 基于/使用(提升)正则表达式拆分字符串以查找令牌

C++ Split string based on/using (boost) regex to find the token

本文关键字:字符串 拆分 查找 令牌 正则表达式 基于 使用 提升 C++      更新时间:2023-10-16

>我需要根据通过正则表达式找到的令牌将字符串拆分为"字符串块"。我还需要将令牌本身保存为最终字符串块的一部分

这是正则表达式和输入字符串,显示了我所追求的复杂性:https://regex101.com/r/bR9gW9/1

我试图做一个简单的例子,但它无法编译:http://cpp.sh/9qifd

#include <iostream>
#include <string>
#include <boost/regex.hpp>
#include <vector>
using namespace std;
int main()
{
    string data = "TAKE some stuffnTAKE other stuffnTAKE more stuffn";
    boost::regex separate_take_chunks("TAKE");
    vector<string> take_chunks;
    //boost::sregex_token_iterator i(data.begin(), data.end(), separate_take_chunks, -1);
    boost::sregex_token_iterator j;
    //while (i != j) cout << *i++;
}

这是使用标准正则表达式,它可以工作,但它没有给我令牌 http://cpp.sh/2jlv

#include <iostream>
#include <string>
#include <regex>
using namespace std;
int main()
{
    string data = "TAKE some stuffnTAKE other stuffnTAKE more stuffn";
    std::regex separate_take_chunks("TAKE");
    std::sregex_token_iterator iter(data.begin(), data.end(), separate_take_chunks, -1);
    std::sregex_token_iterator end;
    for ( ; iter != end; ++iter)
    std::cout << *iter << "---n";
}
这里没有使用正则表达式,

但是如果我可以用正则表达式替换查找函数,这将很好地工作:

size_t p1 = 4;
size_t p2 = 0;
while (p2 != string::npos) {
    p2 = data.find("TAKEn", p1);
    take_chunks.push_back(data.substr(p1-4, p2));
    p1 = p2+4;
}   

对于第一个示例,您尚未设置提升标头路径。我不确定你是否可以在外壳中做到这一点。

运行: http://cpp.sh/5ndl

#include <iostream>
#include <string>
#include <regex>
#include <vector>
using namespace std;
int main()
{
    string data = "NAME some name stuffnTAKE some take stuffnTAKE SEL some take sel stuffn";
    regex separate_take_chunks("TAKE SEL|TAKE|NAME");
    vector<string> take_chunks;
    std::sregex_token_iterator i(data.begin(), data.end(), separate_take_chunks, { -1, 0 });
    std::sregex_token_iterator j;
    ++i; // there is no unmatched content (-1) initially, so skip it
    while (i != j) {
        take_chunks.push_back(*i++); // put matched content (0) in new index
        if (i != j) take_chunks.back() += *i++; // add unmatched content (-1)
    }
    for (const auto& c : take_chunks) cout << c << "--" <<endl;
}

{ -1, 0 }表示输出不匹配的内容,后跟匹配的内容。如果要输入12则意味着输出正则表达式组 1 或 2,{ 3, 4 }将输出/连接组 3 和 4。但是我们在这里没有使用组,所以 -1 和 0 是唯一可能的输出。

初始++i是跳过第一个-1(不匹配的内容(并继续0(匹配的内容(,因为在字符串的第一部分之前没有不匹配的内容 NAME

从本质上讲,这创造了一种模式:

-1(跳过不匹配,因为它是空的(

0 + -1(连接匹配和不匹配(

0 + -1

..等。

我认为它的工作方式是正则表达式函数一旦找到匹配项就会停止寻找匹配项,因此当它找到 NAME 时,它就完成了该迭代的内容捕获。因此,-1是空的,0是"NAME"。通过执行初始++i我们跳过空-1。下一次迭代-1具有在正则表达式尝试查找"TAKE"时捕获的不匹配内容。因此,我们将-1不匹配的内容与"NAME"连接起来,并将"TAKE"放在向量的新索引中。

更多信息: http://www.cplusplus.com/reference/regex/regex_token_iterator/regex_token_iterator/

如果您想

采用位置/substr 方法,另请参阅此内容以获取匹配项的位置:使用 regex_search 获取所有匹配项的索引?

也有帮助:http://www.cplusplus.com/reference/regex/match_results/