Как вы упомянули, я собираюсь предположить, что ваши входные файлы гарантированно будут выглядеть так, как вы описали - в противном случае C ++ слишком сложен для общего анализа с регулярными выражениями.
Вы должны сделатьшаблон регулярного выражения для отдельного назначения, и используйте sregex_iterator
, чтобы пройти через него.
Я приведу пример здесь: https://en.cppreference.com/w/cpp/regex/regex_iterator
std::regex declare_pattern(R"(([a-zA-Z_]\w*)=(\d+\.\d*);?)");
std::string input("x2=2;_y=5.2");
auto declare_begin = std::sregex_iterator(input.begin(), input.end(), declare_pattern);
auto declare_end = std::sregex_iterator();
for (std::sregex_iterator i = declare_begin; i != declare_end; ++i) {
std::smatch match = *i;
std::cout << match[1] << " is " << std::stof(match[2]) << '\n';
}
Разбивка регулярного выражения
R"(...)"
- Это необработанная строка,поэтому я могу использовать обратную косую черту без компилятора, пытающегося экранировать их ([a-zA-Z_]\w*)
- это переменная. Содержимое в скобках соответствует одному буквенному символу или подчеркиванию. \w*
соответствует нулю или более «словесных» символов (например, az, AZ, _ и 0-9). Круглые скобки означают, что мы собираемся «захватить» его или записать, чтобы я мог получить к нему доступ позже match[N]
. =
- буквально символ «=» (\d+\.\d*)
соответствует ОЧЕНЬ простому значению типа «42.123». Вам понадобится более сложный шаблон, чтобы сопоставить все различные способы, которыми C ++ должен выражать число, научную запись и т. Д. ;?
- , опционально соответствует точке с запятой, для разделения объявлений
Это делает нулевые проверки. Обрабатывает нулевые причуды, такие как пробелы и т. Д. После определенного уровня сложности вы должны подумать о том, чтобы попытаться выполнить традиционный анализ. Мне нравится PEGLTL , который может описывать простые шаблоны, не перегружая людей формальными обозначениями или понятиями:
struct number : seq< plus<digit>, one<'.'>, plus<digit> > {};
struct assignment : seq< identifier, one<'='>, number > {};
struct var_list : list< assignment, one<';'> > {};
/*...*/
memory_input in( "x=2.2;y=3", "" );
auto result = parse< var_list >( in );