理解verbalexpressions.hpp 库:不需要理解正则表达式语法就可以写出优雅的正则表达式

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 是一个非常值得尝试的工具。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值