前言
以前写好的正则函数的例子,今天发现在工程里,有的字符串匹配的不对。
用的函数就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