在 Linux 环境下使用 C++ 处理正则表达式主要有两种方式:POSIX 正则表达式库和 C++11 引入的 <regex>
标准库。下面我将详细介绍这两种方法。
这是传统的 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(®ex, pattern, REG_EXTENDED);
if (ret) {
char error_msg[100];
regerror(ret, ®ex, error_msg, sizeof(error_msg));
std::cerr << "Regex compilation failed: " << error_msg << std::endl;
return 1;
}
// 执行匹配
ret = regexec(®ex, 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, ®ex, error_msg, sizeof(error_msg));
std::cerr << "Regex match failed: " << error_msg << std::endl;
}
// 释放正则表达式
regfree(®ex);
return 0;
}
regcomp()
- 编译正则表达式regexec()
- 执行匹配regerror()
- 获取错误信息regfree()
- 释放正则表达式资源<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;
}
匹配检查 - std::regex_match()
std::regex_match(target_string, regex_object)
搜索匹配 - std::regex_search()
std::smatch matches;
if (std::regex_search(target_string, matches, regex_object)) {
// 处理匹配结果
}
替换 - std::regex_replace()
std::string result = std::regex_replace(target_string, regex_object, replacement);
迭代匹配 - 使用 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);
std::regex
对象,而不是每次使用时重新编译。转义字符问题:在 C++ 字符串中,反斜杠需要双重转义:
// 匹配一个数字后跟一个点
std::regex r("\\d\\."); // 正确
std::regex r("\d\."); // 错误
Unicode 支持:C++11 正则表达式对 Unicode 支持有限,如果需要完整 Unicode 支持,可以考虑使用第三方库如 ICU 或 PCRE。
性能优化:对于复杂的正则表达式,可以考虑使用 std::regex::optimize
标志:
std::regex r("pattern", std::regex::optimize);
希望这些信息能帮助你在 Linux 环境下使用 C++ 处理正则表达式!