以下面的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;
}
答案 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。即这是不允许的。