gpt4 book ai didi

c++ - 仅在捕获组的最后一次出现时使字符可选

转载 作者:行者123 更新时间:2023-11-30 04:49:05 24 4
gpt4 key购买 nike

我正在尝试在我的 C++ 应用程序中使用正则表达式来测试字符串是否匹配常见的数组类型格式。该字符串应匹配由逗号分隔的数字列表,由任意数量的空白字符包围并由大括号括起来。所以,

 {1, 2, 3}`, 
{12.234,2313.4231,
{+1.232, -2313.32, 12}

应该都匹配正确。我当前的正则表达式字符串是这样的(为清楚起见添加了空格):

\\{ ( \\s*?[+-]?[0-9]+\\.?[0-9]?,\\s*? )+ \\}

这个字符串的问题是逗号是必需的在每个数字之后,以便被认为是一个有效的字符串。也就是说,字符串 {12, 12, 12,} 有效,但字符串 {12, 12, 12} 不匹配,因为缺少最后一个逗号。我可以通过在逗号后面包含 ? 来使逗号可选,但这会使字符串 {12 12 12} 有效,我想避免这种情况。

我应该如何使逗号字符仅在字符串中最后出现时可选?

这是一个代码片段来说明我的问题:

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

int main()
{
std::regex test("\\{(\\s*?[+-]?[0-9]+\\.?[0-9]?,\\s*?)+\\}");
std::string input;
while(1){
std::getline(std::cin, input);
if(input == "exit")
break;
if(std::regex_match(input, test))
std::cout << "string matches" << std::endl;
else
std::cout << "string does not match" << std::endl;
}
}

最佳答案

如果你在顶部提到的三个字符串是有效的({1, 2, 3}, {12.234,2313.4231,} and {+1.232 , -2313.32, 12}) 您可以使用两种方法:一种具有积极前瞻性的交替,检查末尾是否有 } ((?:,\\s*|(?=\\}$)))

std::regex test("\\{(?:\\s*[+-]?[0-9]+\\.?[0-9]*(?:,\\s*|(?=\\}$)))+\\}");

或在最后一个 之前添加一个可选的逗号 ,?:

std::regex test("\\{\\s*[+-]?[0-9]+\\.?[0-9]*(?:,\\s*[+-]?[0-9]+\\.?[0-9]*)*\\s*,?\\}");

参见 regex demo 1regex demo 2 .

如果 {1, 2, 3,} 无效,最好的方法是展开重复组:

std::regex test("\\{\\s*[+-]?[0-9]+\\.?[0-9]*(?:,\\s*[+-]?[0-9]+\\.?[0-9]*)*\\s*\\}"); 

参见 this regex demo .

关于c++ - 仅在捕获组的最后一次出现时使字符可选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55554037/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com