C++ 基于/使用(提升)正则表达式拆分字符串以查找令牌
C++ Split string based on/using (boost) regex to find the token
>我需要根据通过正则表达式找到的令牌将字符串拆分为"字符串块"。我还需要将令牌本身保存为最终字符串块的一部分
这是正则表达式和输入字符串,显示了我所追求的复杂性: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 }
表示输出不匹配的内容,后跟匹配的内容。如果要输入1
或2
则意味着输出正则表达式组 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/
- 将字符串拆分为标记,并将标记拆分为两个单独的数组
- 将字符串拆分为等长 c++ 的部分
- 如何使用 Boost C++ 打印第 n 个字符串拆分?
- 我在将字符串拆分为向量时遇到困难
- C++ 如何将字符串拆分为单个字符
- 是否有用于执行反向字符串拆分器的开箱即用功能?
- 如何将字符串拆分为一组 3 个字符,它们之间有空格
- 将字符串拆分为单个单词并将它们放置在向量中
- 基于其中的数字子字符串拆分字符串
- 如何在C++中将数字字符串拆分为数组
- 如何在 c++ 中将字符串拆分为字符串 2d 数组数组
- 如何将标准::字符串拆分为标准::string_views的范围 (v3)
- 将特定格式的字符串拆分为浮点数和字符串
- 在 c++ 中将字符串拆分为单独的变量
- 用C 中的4个字符将字符串拆分
- 如何用Arduino中的另一个字符串将字符串拆分
- 如何在 Main 方法之外将字符串拆分为标记
- C 将字符串按空白空间将字符串拆分,除非将其封闭在引号中并存储在向量中
- 将字符串拆分为矢量 C++
- 试图将字符串拆分为两个整数