使用正则表达式c++从单词和分隔符之间的字符串中提取所有子字符串
Extract all substrings from a string that are between a word and a delimiter using regex c++
我有以下查询:
std::string query =
"ODR+1"
"DPT+::SFO"
"ARR+::MKE"
"ODR+2"
"DPT+::MKE"
"ARR+::SFO";
我试图从以ARR
或DPT
开头的所有段中提取::
之后的值。我编写了以下正则表达式[DPT|ARR]+::(.*)
。当我在regex101 上测试它时,它起了作用
当我编写以下C++代码时。我得到了以下输出:
DPT+::SFO'ARR+::MKE'ODR+2'DPT+::MKE'ARR+::SFO'
输出是错误的,我真的只想提取SFO和MKO。如何修改正则表达式查询以仅提取这些模式
#include <regex>
#include <iostream>
int main()
{
std::string query =
"ODR+1'"
"DPT+::SFO'"
"ARR+::MKE'"
"ODR+2'"
"DPT+::MKE'"
"ARR+::SFO'";
std::regex regulaExpression("(DPT|ARR).*::(.*)'");
std::sregex_iterator iter(query.begin(), query.end(), regulaExpression);
std::sregex_iterator end;
while(iter != end)
{
std::cout << iter->str() << std::endl;
++iter;
}
}
更新
我更新了代码:
#include <regex>
#include <iostream>
#include <cstring>
int main()
{
const char *target =
"ODR+1'"
"DPT+::SFO'"
"ARR+::MKE'"
"ODR+2'"
"DPT+::MKE'"
"ARR+::SFO'";
std::regex rgx("(DPT|ARR).*?::(.*?)'");
for(auto it = std::cregex_iterator(target, target + std::strlen(target), rgx);
it != std::cregex_iterator();
++it)
{
std::cmatch match = *it;
std::cout << match[2].str() << 'n';
}
return 0;
}
现在它允许我检索以下内容。这正是我想要的。但我不知道为什么它有效。
SFo
MKE
MKE
SFO
为什么我必须使用std::cout << match[2].str() << 'n';
问题出在正则表达式上:
(DPT|ARR).*?::(.*?)'
第一部分(DPT|ARR)
将获得以DPT
或ARR
开头的字符串,但也将保存它,因此结果match[1]
的第一个元素具有此值。为了避免这种情况,请使用非捕获组:(?: )
第二部分.*?
是问题所在:它捕获了所有内容,包括::
,所以正则表达式永远找不到分隔符。您想搜索除:
之外的所有内容,也可能不搜索'
(以避免错误的部分传播给其他人(:(?:[^':]*:)+:
第一部分搜索第一个:
之前的内容,然后检查紧接着还有另一个:
。如果你确定这个部分没有单一的:
,你可以简化它
最后,您将获得所需的字符串:([^']*)
,直到第一个'
。括号只用于捕获内容,因此您可以使用match[1]
检索它
(?:DPT|ARR)(?:[^':]*:)+:([^']*)
相关文章:
- 从字符串中提取整数并形成一个数组
- C ++中的StringStream有助于使用向量从字符串中提取逗号分隔的整数,而不是空格分隔的整数,为什么?
- asn1c 不会从 asn.1 模块中提取八位字节字符串的默认值
- 如何在字符串中找到字符,然后在C++中提取其余的字符串
- std::regex:匹配由数字和空格组成的字符串,并提取数字.如何?
- 使用从文件(stod、strtod、atof)中提取的数据C++从字符串转换为双精度.csv
- 清除输入缓冲区后未提取字符串流
- 如何创建一个函数来提取向量内部字符串中的字段?
- 从没有空格的字符串中提取整数
- 如何使用正则表达式从字符串中提取值
- 使用正则表达式c++从单词和分隔符之间的字符串中提取所有子字符串
- 提取字符串中的随机单词
- 将子字符串提取到最后 n 个分隔符C++
- 如何在C 中不带有弦乐和strtok的情况下拆分字符串(提取单词)
- Arduino中的字符串提取问题
- C++ 在将字符串提取到标量时处理溢出/下溢
- 将两个 '' 字符之间的子字符串提取到单独的数组中
- 字符提取与字符串提取有何不同
- 如何从输入字符串提取数值?c++
- 作为XML字符串提取请求/响应