0、背景
在 C++ 开发中,正则表达式常用于文本处理和模式匹配。然而,标准的 C++ 正则表达式库()相对较为复杂且语法上有些笨拙。因此,许多开发者寻找更简洁、易用且更具表现力的解决方案。verbalexpressions.hpp 库应运而生,作为一个简单而强大的 C++ 正则表达式库替代方案,它通过易于理解的 API 来简化模式匹配的构造过程。
1、verbalexpressions.hpp库的特点
- 简洁性:通过链式调用来构建正则表达式,语法更贴近自然语言。
- 易于阅读:相较于传统正则,verbalexpressions.hpp 使用命名方法和表达式来代替复杂的符号,降低了错误的可能性。
- 跨平台:作为 C++ 库,verbalexpressions.hpp 适用于各种平台,只需简单的头文件引用。
- 开源与自由:该库是开源的,可以自由使用和修改。
2、核心代码详解
本人对该库的理解写在下面代码的注释中,根据本人知识库,下面代码中的注释只是库源码的一部分,全部代码请查看完整的hpp文件:
class verex
{
using flag_type = veregex::regex::flag_type;
private:
// 前缀字符串
std::string prefixes;
// 中间的匹配模式字符串
std::string source;
// 后缀字符串
std::string suffixes;
// 模式
std::string pattern;
unsigned int modifiers;
// GLOBAL标志可能表示全局匹配模式(在整个输入字符串中查找所有匹配项
// MULTILINE标志可能用于多行匹配(处理包含换行符的输入字符串,使得^和$可以匹配每行的开头和结尾, 如果关闭,即匹配第一行的数据)
// CASEINSENSITIVE标志用于不区分大小写的匹配
enum Flags {
GLOBAL = 1
, MULTILINE = 2
, CASEINSENSITIVE = 4
}
// ^ 代表行开始, $代表行结束
verex & start_of_line(const bool enable)
{
prefixes = enable ? "^" : "";
return add("");
}
verex & end_of_line(const bool enable)
{
suffixes = enable ? "$" : "";
return add("");
}
// 后面的?表示是可选的
verex & maybe(const std::string & value)
{
return add("(?:" + value + ")?");
}
// 一个或多个
verex & something()
{
return add("(?:.+)");
}
// source 需要进行字符串匹配的原始字符串
// pattern 匹配模式
// value 如将匹配上的部分替换为的字符串
std::string replace(const std::string & source, const std::string & value)
{
return veregex::regex_replace(
source
, veregex::regex(pattern, check_flags())
, value
);
}
// windows中换行符是\r\n, 但是Linux中的换行符是\n
verex & linebreak()
{
return add("(?:(?:\\n)|(?:\\r\\n))");
}
// 这里不可以传入"abc" "ghj"只能传入单个的字符
verex & range(const std::string & a, const std::string & b)
{
return range({{a, b}});
}
// 这是一个或,前面的或者后面的,这是一个捕获型的括号,value是后面的条件
verex & alt(const std::string & value)
{
if (prefixes.find("(") == std::string::npos) {
prefixes += "(";
}
if (suffixes.find(")") == std::string::npos) {
suffixes = ")" + suffixes;
}
add(")|(");
return then(value);
}
// 进行字符串匹配,匹配成功返回true,匹配失败返回false
bool test(const std::string & value)
{
const std::string to_test = (modifiers & MULTILINE) ? value : reduce_lines(value);
if (modifiers & GLOBAL) {
return veregex::regex_search(to_test, veregex::regex(pattern, check_flags()));
} else {
return veregex::regex_match(to_test, veregex::regex(pattern, check_flags()));
}
}
};
3、使用方法
这个库最大的特点就是可以进行链试调用,下面给出使用方法,见代码:
// test case 1
verex expr = verex()
.search_one_line()
.start_of_line()
.then( "://" )
.maybe( "www." )
.anything_but( " " )
.end_of_line();
std::cout << expr.test("https://www.google.com") << std::endl;
// 这里是输出expr的模式,在库中对<<运算符进行了重载
std::cout << expr << std::endl;
// test case 2
// 找到原始字符串中的red,并将其替换为blue
std::cout << verex().find( "red" ).replace( "We have a red house", "blue" ) << std::endl;
4、总结
verbalexpressions.hpp 是一个优秀的 C++ 库,特别适合那些需要构建和使用正则表达式的开发者。它提供了简洁且易于理解的 API,帮助开发者避免繁琐的正则语法,同时让代码更加可读和易于维护。通过这个库,开发者可以轻松构建出清晰而强大的正则表达式,尤其在处理简单到中等复杂度的文本匹配任务时非常高效。如果你对正则表达式不太熟悉,或者希望使正则表达式代码更加简洁明了,verbalexpressions.hpp 是一个非常值得尝试的工具。