You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 13:01:17