Использование Regex для разбора строки в cpp и создания карты - PullRequest
0 голосов
/ 11 ноября 2019

В cpp: я пытаюсь проанализировать заданную строку, такую ​​как - "x = 3.5; y = 9.5", где мне нужно проанализировать x и его значение при использовании регулярных выражений и построении MAP между x иего значение 3,5, то же самое касается у и 9,5. Имя переменной должно начинаться с символа z, затем оно может содержать заниженную оценку, цифры и символы. Разделитель между переменными: ';'

1 Ответ

1 голос
/ 11 ноября 2019

Как вы упомянули, я собираюсь предположить, что ваши входные файлы гарантированно будут выглядеть так, как вы описали - в противном случае 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 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...