如何设置一个范围来提取我想要获得的信息
how to set a range to extract the information I want to get?
我正试图从数据中提取一堆信息。例如
[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("");
}
到目前为止,我成功地提取了具体的信息,如姓名等。但并不是所有的信息。我的想法是用括号"修改regex名称的部分;[]";以提取该代码的字符串范围。但是失败。
您可以读取文件并对内容使用以下正则表达式。使用regex_search
,您可以搜索学生并对组进行迭代。
您可以使用此正则表达式查找学生并提取其数据:
[studentw+]nid: *001nname: *(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分配给变量id
,并使用构建正则表达式字符串
R"([studentw+]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"([studentw+]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] << "nn";
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
相关文章:
- 如何设置一个范围来提取我想要获得的信息
- 链接列表运算符重载没有打印出我想要的内容
- 莱克斯没有返回我想要的东西
- 而不是那么多的 if 语句,我想要一个逻辑,我可以用一个语句或优化的方式来完成
- 我想要一个具有子函数的函数访问相同的命名函数,而不使用它取决于其子类的类
- 如何让m_refcount变量打印出我想要的值而不是垃圾
- 我想要一个改变数组快速排序的2个数字的函数
- 输出不是我想要C++的
- 使用运算符覆盖排序没有得到我想要的
- C ++,否则文本程序不会进入我想要的途径
- 如何声明一个未知大小的数组,然后输入直到我想要,然后获取数组的大小
- 我如何使用 juce 的文件过滤器描述我想要的文件过滤器?
- 如何设置此视觉工作室 (2015) 自定义生成步骤(工具?基本上,我想要一个修改头文件(c ++)的预处理器步骤
- 代码不会发送我想要的权衡
- 无法在openGL和GLUT中为我想要的确切对象设置动画
- 我如何强迫Visual Studio使用我想要的依赖性库名称
- 我的 OpenGL QQuickItem 没有我想要的大小
- 我可以/应该在 #ifndef 后输入任何我想要的东西
- C++ microshell,输入一个命令并使用fork(),dup(),pipe()将其通过管道传输到进程。只是我没有得到我想要的结果
- 矢量在C++中,我的代码可以工作,但不是我想要的那样