как установить диапазон для извлечения информации, которую я хочу получить? - PullRequest
0 голосов
/ 11 июля 2020

Я пытаюсь извлечь часть информации из данных. например,

[student1]
id: 001
name:red
surname:brown
phone number:0123456
address: blabla

из этих данных (это текстовый файл), я хочу извлечь всю информацию об этом ученике, используя регулярное выражение, просто введя номер ученика 001.

вот код, который я пробовал.

  ifstream file (filename);
  string line;
  bool found = false;
  regex format("[0-9]{3}");
  regex name("^name:");
  if (regex_search(id, format)) {
    regex Id("^id: "+id);
    if (file.is_open()) {
      while ( getline (file,line)) {
        if (regex_search(line, Id)) {
          found = true;
        } else if ( found && regex_search(line, name) ) {
          return line;
          break;
        }
      }
    } else {
      return "Sorry, can not open file.";
    }
    file.close();
  } 
  return("");
}

до сих пор мне удалось извлечь определенную c информацию, такую ​​как имя или фамилия и т.д. c .. но не всю информацию. Моя идея - изменить часть имени регулярного выражения с помощью скобки «[]», чтобы извлечь диапазон строки в этом коде. но ... не удалось.

1 Ответ

0 голосов
/ 11 июля 2020

Вы можете прочитать файл и использовать следующее регулярное выражение для содержимого. С помощью regex_search вы можете искать ученика и перебирать группы.

Вы можете использовать это регулярное выражение, чтобы найти ученика и извлечь его данные:

\[student\w+\]\nid: *001\nname: *(\w*)\nsurname: *(\w*)\nphone number: *(\w*)\naddress: *(\w*)

Например, для

[student0]
id: 000
name:red
surname:brown
phone number:0123456
address: blabla
[student1]
id: 001
name:red
surname:brown
phone number:0123456
address: blabla
[student2]
id: 002
name:red
surname:brown
phone number:0123456
address: blabla

он будет соответствовать

[student1]
id: 001
name:red
surname:brown
phone number:0123456
address: blabla

, а группы содержат

red, brown, 0123456 и blabla.

Хороший онлайн-инструмент для работы с регулярными выражениями: https://regexr.com/5891j

Вы можете присвоить идентификатор, который вы ищете, переменной id и построить строку регулярного выражения. с:

R"(\[student\w+\]\nid: *)"s + id + R"(\nname: *(\w*)\nsurname: *(\w*)\nphone number: *(\w*)\naddress: *(\w*))"s;

Пример кода:

#include <fstream>
#include <iostream>
#include <regex>
#include <string>
using std::literals::string_literals::operator""s;

int main() {
    std::string id = "001";
    std::regex regex((R"(\[student\w+\]\nid: *)"s + id + R"(\nname: *(\w*)\nsurname: *(\w*)\nphone number: *(\w*)\naddress: *(\w*))"s).c_str());
    std::ifstream file("data.txt");
    if (!file) return EXIT_FAILURE;
    
    std::string content{std::istreambuf_iterator<char>(file), std::istreambuf_iterator<char>()};
    std::smatch matches;
    if (std::regex_search(content, matches, regex)) {
        std::cout << "Student data:\n" << matches[0] << "\n\n";
        std::cout << "Id: " << id << '\n';
        std::cout << "Name: " << matches[1] << '\n';
        std::cout << "Surname: " << matches[2] << '\n';
        std::cout << "Phone: " << matches[3] << '\n';
        std::cout << "Address: " << matches[4] << '\n';
    }
}

Пример вывода:

Student data:
[student1]
id: 001
name:red
surname:brown
phone number:0123456
address: blabla

Id: 001
Name: red
Surname: brown
Phone: 0123456
Address: blabla
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...