空正则表达式在POSIX BRE / ERE中的含义是什么?

时间:2015-12-09 21:00:23

标签: regex posix glibc posix-ere

以下面的API regex_match为例,如果我用regex_match(any_string_here,“”)调用它,你可以看到我在这里传递了一个空的正则表达式,然后它总是返回0,这意味着匹配成功。那么,空正则表达式在POSIX BRE / ERE中意味着什么?

空正则表达式意味着我将“”传递给glibc regcomp函数。请参阅以下示例。

int regex_match( const char* haystack, const char* needle )
{
        regex_t needle_pattern;
        int regex_flag = REG_NOSUB | REG_EXTENDED;
        int rc = regcomp(&needle_pattern,needle, regex_flag);
        if (rc != 0){
                char error_msg[256];
                size_t error_len = 0;
                error_len = regerror(rc,&needle_pattern,error_msg,sizeof(error_msg));
                error_len = error_len < sizeof(error_msg) ? error_len : sizeof(error_msg) - 1;
                error_msg[error_len] = '\0';
                cout<<"compile error: "<<error_msg<<endl;
                regfree(&needle_pattern);
                return regcomp_error_base + rc;
        }
        rc = regexec(&needle_pattern, haystack, 0, NULL, 0);
        if ( (rc != 0) && (rc != REG_NOMATCH)){
                char error_msg[256];
                size_t error_len = 0;
                error_len = regerror(rc,&needle_pattern,error_msg,sizeof(error_msg));
                error_len = error_len < sizeof(error_msg) ? error_len : sizeof(error_msg) - 1;
                error_msg[error_len] = '\0';
                cout<<"exec error: "<<error_msg<<endl;
        }
        regfree(&needle_pattern);
        //regexec returns 0 if the regular expression matches
        return rc;
}

4 个答案:

答案 0 :(得分:1)

这是我能找到的唯一参考(source):

case regex_constants::__re_err_empty:
    return "An empty regex is not allowed in the POSIX grammar.";

这意味着由语言正则表达式实现来定义行为是什么,POSIX与它几乎没有关系。

注意 regex.h中缺少此错误!在您的情况下,您有一个空/空字符串匹配,因为您将空字符串作为模式传递。以下是我在regex.c source code中找到的内容:

  

对于某些模式,例如 (a?)?p+j 此处指向
   模式结束。我们不想提出这样的观点,
   因为当我们将其恢复到上面时,进入开关将是
   在模式结束后增加p。我们不需要
   推动这一点,因为我们显然不会再发现这一点了    快速地图条目超出pend这样的模式可以匹配
   但是,空字符串。

因此,如果执行单个搜索,则空模式匹配输入字符串中第一个符号之前的空字符串,如果执行全局搜索,则所有符号之前的所有空字符串

答案 1 :(得分:0)

空的正则表达式匹配空字符串。如果搜索字符串是空字符串,则它匹配整个事物。如果搜索字符串不为空,则匹配搜索字符串的每个字符之间的空字符串。

答案 2 :(得分:0)

我猜“”将占用内存中的1个字节,即“\ 0”,并且“any_string_here”在内存中看起来像“any_string_here \ 0”,因此“\ 0”始终匹配“any_string_here \ 0”。

答案 3 :(得分:0)

  

POSIX与它没什么关系。

嗯,POSIX定义了BRE / ERE的语法。例如:

/* --------------------------------------------
   Extended Regular Expression
   --------------------------------------------
*/
extended_reg_exp   :                      ERE_branch
                   | extended_reg_exp '|' ERE_branch
                   ;
ERE_branch         :            ERE_expression
                   | ERE_branch ERE_expression
                   ;
ERE_expression     : one_char_or_coll_elem_ERE
                   | '^'
                   | '$'
                   | '(' extended_reg_exp ')'
                   | ERE_expression ERE_dupl_symbol
                   ;
one_char_or_coll_elem_ERE  : ORD_CHAR
                   | QUOTED_CHAR
                   | '.'
                   | bracket_expression
                   ;
ERE_dupl_symbol    : '*'
                   | '+'
                   | '?'
                   | '{' DUP_COUNT               '}'
                   | '{' DUP_COUNT ','           '}'
                   | '{' DUP_COUNT ',' DUP_COUNT '}'
                   ;

这个语法没有生成空的正则表达式,i。即这是不允许的。