使用正则表达式获取大括号块的列表

时间:2018-10-13 23:35:40

标签: c++ regex

我正在为使用c ++进行的项目构建一个简单的数据编码器/解码器,数据以这种格式(虚拟数据)写入文件:

{X143Y453CGRjGeBK}{X243Y6789CaRyGwBk}{X5743Y12CvRYGQBs}

块的数量是不确定的,块的大小是可变的。

要解码图像,我需要遍历每个花括号块并处理其中的数据,理想的输出应如下所示:

"X143Y453CGRjGeBK" "X243Y6789CaRyGwBk" "X5743Y12CvRYGQBs"

我最近的是:

"\\{(.*)\\}"

但这给了我整个序列,而不是每个块。

很抱歉,如果这是一个简单的问题,但是正则表达式尚未真正引起我的注意,正则表达式是否有可能,还是我应该使用其他方法?

2 个答案:

答案 0 :(得分:1)

您可以使用[^{}]+

  • [^{}]:匹配下面列表中不存在的单个字符(在本例中为'{' & '}'
  • \+:匹配该字符后,请匹配一次且不限次数。

测试:https://regex101.com/r/bNOK5U/1/

答案 1 :(得分:1)

要提取在花括号内多次出现的子字符串,而花括号内没有括号(即,最里面的括号内的子字符串),则可以使用

#include <iostream>
#include <string>
#include <vector>
#include <regex>

int main() {
    std::regex rx(R"(\{([^{}]*)})");
    std::string s = "Text here {X143Y453CGRjGeBK} and here {X243Y6789CaRyGwBk}{X5743Y12CvRYGQBs} and more here.";
    std::vector<std::string> results(std::sregex_token_iterator(s.begin(), s.end(), rx, 1),
                               std::sregex_token_iterator());

    for( auto & p : results ) std::cout << p << std::endl;
    return 0;
}

查看C++ demo

std::regex rx(R"(\{([^{}]*)})")正则表达式字符串为\{([^{}]*)},并且与之匹配

  • \{-一个{字符
  • ([^{}]*)-捕获组1:除{}以外的零个或多个字符
  • }-一个}字符。

传递给1的{​​{1}}参数仅提取捕获到组1中的硫磺值。