如何在gtkmm3的ComboBoxText中实现正则匹配并展示文件中的邮箱?
在gtkmm3组合框中实现邮箱列表提取与展示
要实现类似grep -o \b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b /Documents/email/的邮箱提取效果,并在点击组合框时显示这些邮箱,你需要完成以下步骤:
1. 扩展类声明
在你的ABC类中添加邮箱提取工具函数和组合框弹出事件的处理函数:
#include <gtkmm.h> #include <vector> #include <string> class ABC { private: Gtk::ComboBoxText m_Combo; // 从文件提取邮箱的工具函数 std::vector<std::string> extract_emails_from_file(const std::string& file_path); // 组合框弹出时的处理函数 void on_combo_popup(); public: ABC(); // 你原有的选中项变化处理函数 void on_combo_changed(); };
2. 连接弹出信号
在类的构造函数中,将组合框的popup信号(点击下拉按钮时触发)绑定到处理函数:
ABC::ABC() { // 绑定弹出信号,确保点击下拉时加载邮箱列表 m_Combo.signal_popup().connect(sigc::mem_fun(*this, &ABC::on_combo_popup)); }
3. 实现邮箱提取逻辑
使用C++正则表达式从目标文件中提取符合格式的邮箱:
#include <fstream> #include <regex> std::vector<std::string> ABC::extract_emails_from_file(const std::string& file_path) { std::vector<std::string> emails; std::ifstream file(file_path); if (!file.is_open()) { return emails; // 文件打开失败时返回空列表 } // 匹配邮箱的正则表达式,启用大小写不敏感模式 const std::regex email_regex(R"(\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b)", std::regex::icase); std::string line; // 逐行读取文件并匹配邮箱 while (std::getline(file, line)) { std::sregex_iterator it(line.begin(), line.end(), email_regex); std::sregex_iterator end; for (; it != end; ++it) { emails.push_back((*it).str()); } } file.close(); return emails; }
4. 填充组合框列表
在弹出事件处理函数中,清空旧选项并填充提取到的邮箱:
void ABC::on_combo_popup() { // 清空组合框现有内容 m_Combo.remove_all(); // 提取目标文件中的邮箱(替换为你的实际文件路径) std::vector<std::string> emails = extract_emails_from_file("/Documents/email/"); // 将邮箱添加到组合框 for (const auto& email : emails) { m_Combo.append(email); } // 如果有邮箱,默认选中第一个选项 if (!emails.empty()) { m_Combo.set_active(0); } }
5. 处理选中项变化(原有函数)
你的on_combo_changed函数可以处理用户选中邮箱后的业务逻辑:
void ABC::on_combo_changed() { Glib::ustring selected_email = m_Combo.get_active_text(); if (!selected_email.empty()) { // 这里添加选中邮箱后的逻辑,例如: // std::cout << "选中的邮箱: " << selected_email << std::endl; } }
注意事项
- 确保文件路径正确,且程序有读取该文件的权限
- 如果目标文件过大,同步读取可能导致UI卡顿,可考虑使用Glib的异步IO来加载文件
- 正则表达式可根据需求调整,比如支持更多域名后缀格式
内容的提问来源于stack exchange,提问作者user19952081
相关产品推荐
相关产品推荐

