插件窝 干货文章 C++ Linux中如何使用正则表达式

C++ Linux中如何使用正则表达式

regex std 正则 表达式 132    来源:    2025-05-07

C++ 在 Linux 中使用正则表达式

在 Linux 环境下使用 C++ 处理正则表达式主要有两种方式:POSIX 正则表达式库和 C++11 引入的 <regex> 标准库。下面我将详细介绍这两种方法。

1. POSIX 正则表达式库

这是传统的 Unix/Linux 正则表达式实现,包含在 <regex.h> 头文件中。

基本用法示例

#include <iostream>
#include <regex.h>
#include <string.h>

int main() {
    const char* pattern = "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$";
    const char* email = "example@domain.com";

    regex_t regex;
    int ret;

    // 编译正则表达式
    ret = regcomp(&regex, pattern, REG_EXTENDED);
    if (ret) {
        char error_msg[100];
        regerror(ret, &regex, error_msg, sizeof(error_msg));
        std::cerr << "Regex compilation failed: " << error_msg << std::endl;
        return 1;
    }

    // 执行匹配
    ret = regexec(&regex, email, 0, NULL, 0);
    if (!ret) {
        std::cout << "Email is valid" << std::endl;
    } else if (ret == REG_NOMATCH) {
        std::cout << "Email is invalid" << std::endl;
    } else {
        char error_msg[100];
        regerror(ret, &regex, error_msg, sizeof(error_msg));
        std::cerr << "Regex match failed: " << error_msg << std::endl;
    }

    // 释放正则表达式
    regfree(&regex);

    return 0;
}

常用函数

  • regcomp() - 编译正则表达式
  • regexec() - 执行匹配
  • regerror() - 获取错误信息
  • regfree() - 释放正则表达式资源

2. C++11 <regex> 标准库

C++11 引入了更现代的正则表达式支持,使用更方便,推荐使用这种方式。

基本用法示例

#include <iostream>
#include <regex>
#include <string>

int main() {
    std::string pattern = "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$";
    std::string email = "example@domain.com";

    try {
        std::regex email_regex(pattern);
        bool match = std::regex_match(email, email_regex);

        if (match) {
            std::cout << "Email is valid" << std::endl;
        } else {
            std::cout << "Email is invalid" << std::endl;
        }
    } catch (const std::regex_error& e) {
        std::cerr << "Regex error: " << e.what() << std::endl;
        return 1;
    }

    return 0;
}

常用功能

  1. 匹配检查 - std::regex_match()

    std::regex_match(target_string, regex_object)
    
  2. 搜索匹配 - std::regex_search()

    std::smatch matches;
    if (std::regex_search(target_string, matches, regex_object)) {
       // 处理匹配结果
    }
    
  3. 替换 - std::regex_replace()

    std::string result = std::regex_replace(target_string, regex_object, replacement);
    
  4. 迭代匹配 - 使用 std::sregex_iterator

    std::string s = "some text with several words";
    std::regex word_regex("(\\w+)");
    
    auto words_begin = std::sregex_iterator(s.begin(), s.end(), word_regex);
    auto words_end = std::sregex_iterator();
    
    for (std::sregex_iterator i = words_begin; i != words_end; ++i) {
       std::smatch match = *i;
       std::cout << match.str() << std::endl;
    }
    

正则表达式语法选项

在 C++ <regex> 中,可以指定不同的语法选项:

  • std::regex::ECMAScript - ECMAScript 语法(默认)
  • std::regex::basic - 基本 POSIX 语法
  • std::regex::extended - 扩展 POSIX 语法
  • std::regex::awk - awk 语法
  • std::regex::grep - grep 语法
  • std::regex::egrep - egrep 语法

示例:

std::regex r("pattern", std::regex::extended);

性能考虑

  1. 如果需要重复使用同一个正则表达式,应该编译一次并保存 std::regex 对象,而不是每次使用时重新编译。
  2. 对于简单的字符串匹配,有时标准字符串操作可能比正则表达式更高效。

常见问题解决

  1. 转义字符问题:在 C++ 字符串中,反斜杠需要双重转义:

    // 匹配一个数字后跟一个点
    std::regex r("\\d\\.");  // 正确
    std::regex r("\d\.");    // 错误
    
  2. Unicode 支持:C++11 正则表达式对 Unicode 支持有限,如果需要完整 Unicode 支持,可以考虑使用第三方库如 ICU 或 PCRE。

  3. 性能优化:对于复杂的正则表达式,可以考虑使用 std::regex::optimize 标志:

    std::regex r("pattern", std::regex::optimize);
    

希望这些信息能帮助你在 Linux 环境下使用 C++ 处理正则表达式!