提问者:小点点

如何设置一个范围来提取我想要得到的信息?


我正试图从数据中提取大量信息。 例如,

[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("");
}

到目前为止,我已经成功地提取了具体的信息,如姓名等。 但不是所有的信息。 我的想法是用括号“[]”修改正则表达式名称的部分,以提取代码上的字符串范围。 但是。。。失败了。


共1个答案

匿名用户

您可以读取文件并对内容使用以下正则表达式。 使用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

组包含

RedBrown0123456Blabla

https://regexr.com/5891j是处理正则表达式的一个很好的在线工具

您可以将查找的id分配给变量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