使用正则表达式获取花括号块列表 我正在为C++中的一个项目建立一个简单的数据编码器/解码器,数据以这种格式写入文件(虚拟数据):

使用正则表达式获取花括号块列表 我正在为C++中的一个项目建立一个简单的数据编码器/解码器,数据以这种格式写入文件(虚拟数据):,c++,regex,C++,Regex,块的数量是不确定的,块的大小是可变的 要解码图像,我需要遍历每个花括号块并处理其中的数据,理想的输出如下所示: "X143Y453CGRjGeBK" "X243Y6789CaRyGwBk" "X5743Y12CvRYGQBs" 我得到的最接近的结果是: "\\{(.*)\\}" 但这给了我整个序列,而不是每个块 很抱歉,如果这是一个简单的问题,但我还没有真正使用regex,那么这是否可能使用regex,或者我应该使用其他方法?您可以使用[^{}]+: [^{}]:匹配下表中不存在的单个字符

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

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

"X143Y453CGRjGeBK" "X243Y6789CaRyGwBk" "X5743Y12CvRYGQBs"
我得到的最接近的结果是:

"\\{(.*)\\}"
但这给了我整个序列,而不是每个块


很抱歉,如果这是一个简单的问题,但我还没有真正使用regex,那么这是否可能使用regex,或者我应该使用其他方法?

您可以使用
[^{}]+

  • [^{}]
    :匹配下表中不存在的单个字符(在本例中为
    '{'&'}'
  • \+
    :一旦您匹配了该字符,请尽可能多地匹配一次且无限次

测试:

要提取多个出现在大括号内的子字符串,而这些子字符串内部没有大括号(即,最里面的大括号内的子字符串),可以使用

#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;
}
#包括
#包括
#包括
#包括
int main(){
std::regex rx(R“(\{([^{}]*)}”);
std::string s=“此处的文本{X143Y453CGRjGeBK}和此处的{X243Y6789CaRyGwBk}{X5743Y12CvRYGQBs}以及更多内容。”;
std::vector results(std::sregex_token_迭代器(s.begin(),s.end(),rx,1),
std::sregex_token_iterator();

对于(auto&p:results)std::cout使用[^{}]+看起来很有效,如果有效,我可以将其作为答案发布。非常感谢!发布后,如果像
Text here{X143Y453CGRjGeBK}和here{X243Y6789CaRyGwBk}{X5743Y12CvRYGQBs}这样的字符串,我将标记为
[^{}+
将失败这里还有更多。
请看,这将在更一般的情况下起作用。但是,这非常有用,因为我控制编码方案,在我的情况下,括号之间不应该有文本,所以我将保留更简单的解决方案
#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;
}