匹配外部单引号之间的字符串

时间:2019-09-18 14:52:14

标签: c++ regex

我有以下数据:

compose '`' 'A' to '\C0'
compose '`' 'a' to '\E0'
compose '\'' 'A' to '\C1'
compose '\'' 'a' to '\E1'
compose '^' 'A' to '\C2'
compose '^' 'a' to '\E2'

所有引号都是单引号

我有这个正则表达式

\'(\\.|[^\'])*\'

它与我想要的完全匹配项匹配,但其中包括外部单引号。

此字符串compose '\'' 'A' to '\C1'给了我'\'''A''\C1',但是我需要\'A\C1 < / p>

我可以删除字符串中的第一个和最后一个单引号,但是我想使用正则表达式来实现。

如何获得想要的结果?

对于正则表达式引擎,它用于qt5核心应用程序,因此c ++

3 个答案:

答案 0 :(得分:1)

您的正则表达式不是最佳的。我不知道您到底可以匹配什么,但是根据您提供给我们的数据,此正则表达式将达到目的:\s\'(\S+?\'?)\'

std::regex reg(R"(\s\'(\S+?\'?)\')");
std::string input = R"(
compose '`' 'A' to '\C0'
compose '`' 'a' to '\E0'
compose '\'' 'A' to '\C1'
compose '\'' 'a' to '\E1'
compose '^' 'A' to '\C2'
compose '^' 'a' to '\E2')";

auto begin = std::sregex_iterator(input.begin(), input.end(), reg);
auto end = std::sregex_iterator();
for (auto it = begin; it != end; ++it)
    std::cout << (*it)[1].str() << '\n';

Here是一个完整的例子。

答案 1 :(得分:1)

您的正则表达式需要稍作修改,多次捕获一个组实际上是行不通的。您真正想要的是一个包含零个或多个\\.|[^\']表达式副本的组。您可以对非捕获组执行此操作,该组是通过在组的左括号内添加?:来编写的。完整的正则表达式为:

\'((?:\\.|[^\'])*)\'

您可以在regex101上尝试一下。

答案 2 :(得分:0)

您的正则表达式中已经有一个组-您可以阅读它。

如果您将std::smatch称为results(或您用作std::match_results的任何东西),那么results[1]将给您第一个(也是唯一的)组-提供该字符串实际上匹配,否则为UB。

std::regex r {"\'(\\.|[^\'])*\'"};
std::string input = "compose '`' 'A' to '\\C0'";
std::smatch results;
if(std::regex_search(input, results, r)) {
    std::cout << results[0] << std::endl  //full match
              << results[1] << std::endl; //first group
}