我有以下数据:
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 ++
答案 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
}