正则函数没封装引起正则判断错误

前言

以前写好的正则函数的例子,今天发现在工程里,有的字符串匹配的不对。
用的函数就2个: regcomp, regexec
测试程序封装的是类,正则匹配就正常。
在正式工程中,直接调用函数reg_x,正则匹配就不正常.
数据都一样,可重复的一个测试数据的序列。
确定也不是编译选项的问题.
真看不区别,太杯具了.

实验

对以前写的正则表达式类进行了完善,比以前更好用了。

// @file main.cpp
// @brief test regex

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include "ls_regex.h"

int main(int argc, char** argv)
{
    bool b_is_match = false;
    std::string str_in = "";
    ls_regex my_regex;
    const char* psz_regex_filter = NULL;

    printf("REG_NOERROR = %d\n", REG_NOERROR); // REG_NOERROR is 0

    psz_regex_filter = "~!@#$%^&*(_+>>>>>>>>>>>>>>>>>>>>>>>>>";
    printf("regex filter = [%s]\n", psz_regex_filter);
    my_regex.setfilter(psz_regex_filter);
    if (!my_regex.is_valid_filter()) {
        printf("error : %s\n", my_regex.get_error_msg().c_str());
    }

 // const char* psz_regex_filter = ".*css$"; // not match
 // const char* psz_regex_filter = ".*css$|.*js$"; not match
 // const char* psz_regex_filter = ".*css$|.*js$|.*swf$"; // not match
 // const char* psz_regex_filter = ".*css$|.*js$|.*swf$|.*jpg$"; // not match
 // const char* psz_regex_filter = ".*css$|.*js$|.*swf$|.*jpg$|.*jpeg$|.*png$"; // not match
 // const char* psz_regex_filter = ".*css$|.*js$|.*swf$|.*jpg$|.*jpeg$|.*png$|.*gif$"; // match
 // const char* psz_regex_filter = ".*css$|.*js$|.*swf$|.*jpg$|.*jpeg$|.*png$|.*gif$|.*bmp$"; // match
    psz_regex_filter = ".*gif$|.*bmp$"; //match

    printf("regex filter = [%s]\n", psz_regex_filter);
    my_regex.setfilter(psz_regex_filter);
    if (!my_regex.is_valid_filter()) {
        printf("error : %s\n", my_regex.get_error_msg().c_str());
    }

    str_in = "/04/.Images/item_out.gif";
    b_is_match = my_regex.is_match(str_in.c_str());
    printf("[%s] is [%s]\n", str_in.c_str(), b_is_match ? "match" : "not match");

    /* run result
    building begin...
    building END
    run...
    REG_NOERROR = 0
    regex filter = [~!@#$%^&*(_+>>>>>>>>>>>>>>>>>>>>>>>>>]
    error : Unmatched ( or \(
    regex filter = [.*gif$|.*bmp$]
    [/04/.Images/item_out.gif] is [match]
    THE END
    */

    exit(0);
}
// @file ls_regex.h

#ifndef __LS_REGEX_H__
#define __LS_REGEX_H__

#include <stdlib.h>
#include <stdio.h>
#include <string>
#include <regex.h>

#define REGEX_BUFFER_SIZE   512

class ls_regex {
public:
    ls_regex();
    virtual ~ls_regex();

    void setfilter(const char* psz_filter);
    bool is_match(const char* psz_regex);
    bool is_valid_filter();
    std::string get_error_msg();

private:
    regex_t m_reg;
    std::string m_str_filter;
    bool m_is_valid_filter;
    std::string m_str_error;
};

#endif // #ifndef __LS_REGEX_H__
// @file ls_regex.cpp

#include "ls_regex.h"

ls_regex::ls_regex()
{
    m_is_valid_filter = false;
    m_str_filter = "";
    m_str_error = "";
}

ls_regex::~ls_regex()
{
    if (m_is_valid_filter) {
        regfree(&m_reg);
    }
}

void ls_regex::setfilter(const char* psz_filter)
{
    int i_rc = 0;
    char buf[REGEX_BUFFER_SIZE] = {'\0'};

    m_str_filter = (NULL != psz_filter) ? psz_filter : "";

    if (m_is_valid_filter) {
        regfree(&m_reg);
    }

    m_str_error = "";
    i_rc = regcomp(&m_reg, m_str_filter.c_str(), REG_NOSUB | REG_EXTENDED);
    if (REG_NOERROR != i_rc) {
        regerror(i_rc, &m_reg, buf, sizeof(buf));
        m_str_error = buf;
    }

    m_is_valid_filter = (0 == i_rc);
}

std::string ls_regex::get_error_msg()
{
    return m_str_error;
}

bool ls_regex::is_valid_filter()
{
    return m_is_valid_filter;
}

bool ls_regex::is_match(const char* psz_regex)
{
    int i_rc = 0;

    if (NULL == psz_regex) {
        return false; // not match
    }

    if (!m_is_valid_filter) {
        return true; // if filter is invalid or not set, return as match
    }

    i_rc = regexec(&m_reg, psz_regex, 0, NULL, 0);
    return (REG_NOERROR == i_rc);
}

# build.sh
echo off

PROG_MAIN_IMP_SRC_NAME=main
PROG_OUT_PUT_NAME=case_regex_c++98

clear
echo building begin...

rm *.o

g++ -Wall --std=c++98 -g -I. -c ./$PROG_MAIN_IMP_SRC_NAME.cpp -o ./$PROG_MAIN_IMP_SRC_NAME.o
g++ -Wall --std=c++98 -g -I. -c ./ls_regex.cpp -o ./ls_regex.o

g++ -Wall --std=c++98 -g -I. $PROG_MAIN_IMP_SRC_NAME.o ./ls_regex.o -lstdc++ -pthread -lpthread -lrt -ldl -o $PROG_OUT_PUT_NAME

echo building END

echo run...

chmod 777 $PROG_OUT_PUT_NAME
./$PROG_OUT_PUT_NAME

echo THE END

猜你喜欢

转载自blog.csdn.net/LostSpeed/article/details/81086019
今日推荐