C ++拆分字符串基于/使用(增强)正则表达式来查找令牌

Posted

技术标签:

【中文标题】C ++拆分字符串基于/使用(增强)正则表达式来查找令牌【英文标题】:C++ Split string based on/using (boost) regex to find the token 【发布时间】:2015-12-08 03:18:11 【问题描述】:

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

这是显示我所追求的复杂性的正则表达式和输入字符串: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 stuff\nTAKE other stuff\nTAKE more stuff\n";
    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++;

这里使用了 std 正则表达式,它有效,但它没有给我标记 http://cpp.sh/2jlv

#include <iostream>
#include <string>
#include <regex>

using namespace std;

int main()

    string data = "TAKE some stuff\nTAKE other stuff\nTAKE more stuff\n";
    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";

这里没有使用正则表达式,但如果我可以用正则表达式替换 find 函数,这会很好用:

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

#include <iostream>
#include <string>
#include <regex>
#include <vector>

using namespace std;

int main()

    string data = "NAME some name stuff\nTAKE some take stuff\nTAKE SEL some take sel stuff\n";
    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/

如果您想采用 position/substr 方法,另请参阅此以获得匹配位置:Get the index of all matches using regex_search?

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

【讨论】:

以上是关于C ++拆分字符串基于/使用(增强)正则表达式来查找令牌的主要内容,如果未能解决你的问题,请参考以下文章

Pandas使用split函数基于指定分隔符拆分数据列的内容为列表设置expand参数将拆分结果列表内容转化为多列数据并添加到原数据中replace函数基于正则表达式替换字符串数据列中的匹配内容

c++11正则表达式比python慢

当正则表达式的某些部分要保存在后续的分割字符串中时,如何使用正则表达式在R中拆分字符串?

C# 正则表达式匹配与拆分相同的字符串

在 Embarcadero 的 C++ Builder 中使用 RegEx 将文本拆分为单个单词

R 使用 tidyr::separate 在最后一个空格字符处拆分字符串