不存在可选子字符串时,避免匹配中包含空元素

时间:2019-04-30 10:09:42

标签: c++ regex regex-group

我正在尝试创建一个与diff终端命令返回的字符串匹配的正则表达式。

这些字符串以十进制数字开头,可能有一个由逗号和数字组成的子字符串,然后是一个强制字符(acd)和另一个强制十进制数字其次是另一个可选组。

示例:

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+))?

可以工作,但是使用的字符串没有可选的子组(例如47a46match变量将在期望的子字符串的相应位置包含空元素。

例如,在上面的程序中,match的元素(由它们的索引开头)是:

1:47 2: 3:a 4:46 5: 

位置25的元素对应于在这种情况下不存在的可选子字符串,因此我希望match避免检索它们,以便: >

1:47 2:a 3:46 

我该怎么办?

1 个答案:

答案 0 :(得分:1)

我认为最适合您的RE应该是这样的:

std::regex re2(R"((\d+)(?:,\d+)?([a-z])(\d+)(?:,\d+)?)");

-这样,它应该匹配所有必需的组(但可选)

输出:

4
47a46
1:47 2:a 3:46 

注意:re2的参数字符串以c ++ 11表示法给出。

编辑:简化了RE