1

以下面的 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

4 回答 4

1

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

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

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

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

对于某些模式,例如 ,(a?)?这里p+j指向
模式的结尾。我们不想推动这样一个点,
因为当我们在上面恢复它时,输入开关将
增加p超过模式的结尾。我们不需要
推动这一点,因为我们显然不会
pend. 不过,这样的模式可以匹配
空字符串。

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

于 2015-12-09T22:14:54.030 回答
0

我猜“”将占用内存中的 1 个字节,即“\0”,而“any_string_here”在内存中看起来像“any_string_here\0”,所以“\0”总是匹配“any_string_here\0”。

于 2015-12-09T22:32:01.337 回答
0

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

于 2015-12-09T21:55:52.623 回答
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 '}'
                   ;

该文法不能产生空正则表达式,即不允许。

于 2017-09-21T13:18:29.570 回答