我有以下格式的字符串:
7XXXX 8YYYY 9ZZZZ 0LLLL 7XXXX 8YYYY 9ZZZZ 0LLLL

  • ,其中7XXXX 8YYYY 9ZZZZ 0LLLL组可以重复任意次;
  • X,Y,Z,L是数字;
  • 以7,8,9,0开头的组都按顺序
  • 可能会缺少像7XXXX 0LLLL 8YYYY 0LLLL 7XXXX 8YYYY 9ZZZZ 0LLLL
  • 这样的组

    我正在尝试使用Boost::regex库实现我的目标。

    我想将这些组拆分成一个数组或 vector 。现在,我正在尝试对它们进行cout

    我正在尝试以这种方式进行操作,但是我只能在7,8,9,0个组中的每一个中获得完整的字符串匹配或最后一个匹配,但无法获得像这样的字符串7XXXX 8YYYY 9ZZZZ 0LLLL
     const char* pat = "(([[:space:]]+7[0-9]{4}){0,1}([[:space:]]+8[0-9]{4}){0,1}([[:space:]]+9[0-9]{4}){0,1}([[:space:]]+0[0-9]{4}){0,1})+";;
     boost::regex reg(pat);
     boost::smatch match;
     string example= "71122 85451 75415 01102 75555 82133 91341 02134";
    
     const int subgroups[] = {0,1,2,3,4,5,6};
     boost::sregex_token_iterator i(example.begin(), example.end(), reg, subgroups);
     boost::sregex_token_iterator j;
    
     while (i != j)
     {
       cout << "Match: " << *i++ << endl;
     }
    

    样本输出:
    Match: 71122 85451 75415 01102 75555 82133 91341 02134
    <A bunch of empty "Match:" rows>
    Match: 75555
    Match: 82133
    Match: 91341
    Match: 02134
    <A bunch of empty "Match:" rows>
    

    但我想这样得到它:
    71122 85451
    75415 01102
    75555 82133 91341 02134
    

    我知道我做错了,不能使用正则表达式来完成我想做的事情:(为什么我不能使用括号来获得所有递归匹配?

    最佳答案

    编辑:由于我第一次完全误解了,所以我将替换整个答案。我在考虑以下方面:

    const char* pat = "[[:space:]]+((7[0-9]{4})?([[:space:]]+8[0-9]{4})?([[:space:]]+9[0-9]{4})?([[:space:]]+0[0-9]{4})?)";
    boost::regex reg(pat);
    boost::smatch match;
    
    //                    v-- extra space here to make the match easier.
    std::string example= " 71122 85451 75415 01102 75555 82133 91341 02134";
    
    boost::sregex_token_iterator i(example.begin(), example.end(), reg, 1);
    boost::sregex_token_iterator j;
    
    while (i != j)
    {
      std::cout << "Match: " << *i++ << std::endl;
    }
    

    如果无法修改字符串,则解决空匹配问题的方法是
    const char* pat = "((7[0-9]{4})?([[:space:]]+8[0-9]{4})?([[:space:]]+9[0-9]{4})?([[:space:]]+0[0-9]{4})?)";
    boost::regex reg(pat);
    boost::smatch match;
    std::string example= "71122 85451 75415 01102 75555 82133 91341 02134";
    
    boost::sregex_token_iterator i(example.begin(), example.end(), reg, 1);
    boost::sregex_token_iterator j;
    
    while (i != j)
    {
      if(i->length() != 0) {
        std::cout << "Match: " << *i << std::endl;
      }
    
      ++i;
    }
    

    尽管在那种情况下使用regex_iterator而不是regex_token_iterator可能会更好:
    // No need for outer spaces anymore
    const char* pat = "(7[0-9]{4})?([[:space:]]+8[0-9]{4})?([[:space:]]+9[0-9]{4})?([[:space:]]+0[0-9]{4})?";
    
    boost::sregex_iterator i(example.begin(), example.end(), reg);
    boost::sregex_iterator j;
    
    // Rest the same.
    

    关于c++ - 使用Boost::regex进行正则表达式组匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27599186/

    10-11 15:33