美文网首页
使用boost::regex库进行正则表达式匹配

使用boost::regex库进行正则表达式匹配

作者: FredricZhu | 来源:发表于2021-04-18 08:37 被阅读0次

代码非常简单,但是C++的regex库功能非常全面,提供了perl格式正则表达式,posix extend正则表达式和posix basic正则表达式三种正则表达式模式。
本人试了半天,发现posix extend这种模式和我们平常用的正则表达式模式一致,所以建议直接posix extend就够了。
代码如下,
CMakeLists.txt

cmake_minimum_required(VERSION 2.6)
project(lexical_cast)

add_definitions(-std=c++14)

include_directories("/usr/local/include")
link_directories("/usr/local/lib")
file( GLOB APP_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
foreach( sourcefile ${APP_SOURCES} )
    file(RELATIVE_PATH filename ${CMAKE_CURRENT_SOURCE_DIR} ${sourcefile})
    string(REPLACE ".cpp" "" file ${filename})
    add_executable(${file} ${sourcefile})
    target_link_libraries(${file} boost_filesystem boost_regex boost_thread boost_system boost_serialization pthread boost_chrono)
endforeach( sourcefile ${APP_SOURCES} )

main.cpp

#include <boost/regex.hpp>

#include <iostream>

int main(int argc, char* argv[]) {
    std::cout << 
        "Available regex syntaxes:\n" <<
        "\t[0] Perl\n" <<
        "\t[1] Perl case insensitive\n" <<
        "\t[2] POSIX extented\n" <<
        "\t[3] POSIX extented case insensitive\n" <<
        "\t[4] POSIX basic\n" <<
        "\t[5] POSIX basic case insensitive\n" <<
        "Choose regex syntax: ";
    
    boost::regex::flag_type flag;
    // 让用户选择正则表达式语法
    switch(std::cin.get()) {
        case '0':
            flag = boost::regex::perl;
            break;
        case '1':
            flag = boost::regex::perl | boost::regex::icase;
            break;
        case '2':
            flag = boost::regex::extended;
            break;
        case '3':
            flag = boost::regex::extended | boost::regex::icase;
            break;
        case '4':
            flag = boost::regex::basic;
            break;
        case '5':
            flag = boost::regex::basic | boost::regex::icase;
            break;
        default:
            std::cerr << "Incorrect number of regex syntax, Exiting...\n";
            return -1;
    }

    // 不让regex构造函数抛异常
    // 关于C++的两个不成文规定了解下,构造函数有异常需要抛出异常,千万不要在析构函数抛出异常
    // 所以构造函数是可以抛出异常的
    // 这里不让构造函数 抛出异常的原因是,在while循环中,一次构造失败不影响下一次输入正确的表达式
    // 可以使用错误码检测的机制来阻止异常发生,而不是简单的抛出异常,停止程序
    // 或者抛出异常,捕获异常
    // 因为根据异常来判断程序是否执行成功不可取,这种代码不具有可测性,不到不得已不要为之
    // 面试中写出根据异常判断程序是否成功,估计就要等通知了
    flag |= boost::regex::no_except;
    // 清空std::cin
    std::cin.ignore();
    std::cin.clear();

    std::string regex, str;

    do {
        std::cout << "Input regex: ";
        if(!std::getline(std::cin, regex) || regex.empty()) {
            return 0;
        }
        // 如果不设置 不抛出异常,构造函数可能会抛出异常
        const boost::regex e(regex, flag);
        if(e.status()) {
            std::cerr << "Incorrect regex pattern!\n";
            continue;
        }

        std::cout << "String to match: ";
        while(std::getline(std::cin, str) && !str.empty()) {
            bool matched = boost::regex_match(str, e);
            std::cout << (matched ? "MATCH\n": "DOES NOT MATCH\n");
            std::cout << "String to match: ";
        }

        std::cout << '\n';
        // 清空std::cin
        std::cin.ignore();
        std::cin.clear();
    } while(1);
}

程序输出如下,

图片.png
关于库的链接方面,这里有个坑。
本文只讲述C++最常使用的操作平台 Linux平台的配置。
如果你是在ubuntu平台使用regex库,需要自己手动安装一下libcu库,然后添加对应的链接目录。不然的话,编译器在链接boost_regex库时,会报找不到相关函数错误。
当然现代C++编译相当智能,直接会告诉你缺失的libcu库的版本,直接下载相应版本的库就可以。
值得注意的一点是,直接使用类似apt get的方式安装可能不行。
比如我的boost库是1.75版本,boost_regex库依赖于 libcu60版本。
而我本身的ubuntu操作系统是20.04版本,它本身的源里面的libcu库大于60版本。
libcu60版本的库是提供给ubuntu 18.04的。
这时apt-get install就会报找不到libcu60。
解决方案就是到ubuntu官方源手动下载,然后用apt-get install ***.deb。
其他方案好像都不行。vcpkg安装没试过。
如果你是缺少libcu60,可以在如下地址下载,
http://archive.ubuntu.com/ubuntu/pool/main/i/icu/libicu60_60.2-3ubuntu3_amd64.deb

相关文章

网友评论

      本文标题:使用boost::regex库进行正则表达式匹配

      本文链接:https://www.haomeiwen.com/subject/lksmlltx.html