c++ - 当可选子字符串不存在时,避免匹配中的空元素
问题描述
我正在尝试创建一个与diff
终端命令返回的字符串匹配的正则表达式。
这些字符串以十进制数字开头,可能有一个由逗号和数字组成的子字符串,然后是一个强制字符(a
, c
, d
),另一个强制十进制数字后跟另一个可选组,如前所述。
例子:
27a27
27a27,30
28c28
28,30c29,31
1d1
1,10d1
我正在尝试分别提取所有组,但没有,
.
我在 C++ 中这样做:
#include<iostream>
#include<string>
#include<fstream>
#include <regex>
using namespace std;
int main(int argc, char* argv[])
{
string t = "47a46";
std::string result;
std::regex re2("(\\d+)(?:,(\\d+))?([acd])(\\d+)(?:,(\\d+))?");
std::smatch match;
std::regex_search(t, match, re2);
cout<<match.size()<<endl;
cout<<match.str(0)<<endl;
if (std::regex_search(t, match, re2))
{
for (int i=1; i<match.size(); i++)
{
result = match.str(i);
cout<<i<<":"<<result<< " ";
}
cout<<endl;
}
return 0;
}
字符串变量t
是我要操作的字符串。我的正则表达式
(\\d+)(?:,(\\d+))?([acd])(\\d+)(?:,(\\d+))?
正在工作,但使用没有可选子组的字符串(例如47a46
,match
变量将在预期子字符串的相应位置包含空元素。
例如,在上面的程序中,match
(前面有它们的索引)的元素是:
1:47 2: 3:a 4:46 5:
位置中的元素2
并5
对应于在这种情况下不存在的可选子字符串,因此我想match
避免检索它们,以便它是:
1:47 2:a 3:46
我该怎么做?
解决方案
我认为最适合您的 RE 应该是这样的:
std::regex re2(R"((\d+)(?:,\d+)?([a-z])(\d+)(?:,\d+)?)");
- 这样它应该匹配所有必需的组(但可选)
输出:
4
47a46
1:47 2:a 3:46
注意:re2
' 参数字符串以 c++11 表示法给出。
编辑:简化了一点
推荐阅读
- python - 了解 train_test_split 方法
- go - 使用 google.protobuf.Timestamp 在 Go 中解析具有时区偏移的日期时间戳
- python - 我有一串xml要发布到具有多个元素但只发布第一个元素然后停止的API
- sketchapp - 如何将画板导出为按画板名称排序的 PDF
- python - 有没有更好的方法来仅在没有值的情况下返回空字符串,或者在短途有一个值时返回一个值?
- python - 如何在 Matplotlib 中获取条形对象的颜色
- php - 谷歌驱动器设置权限后获取可共享链接
- xampp - 作曲家 windows vs ubuntu
- javascript - 通过 findIndex 方法比较“id”
- python - 有javascript按钮时如何从互联网下载csv文件?