Я пытаюсь использовать регулярные выражения в своем приложении 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}
допустимой, чего я хочу избежать.
Как мне сделать так, чтобы символ запятой был необязательным в last вхождении в строке?
Вот фрагмент кода, иллюстрирующий мою проблему:
#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;
}
}