以下面的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;
}发布于 2015-12-10 06:14:54
这是我能找到的唯一参考(source):
case regex_constants::__re_err_empty:
return "An empty regex is not allowed in the POSIX grammar.";这意味着由语言正则表达式实现来定义行为是什么,而POSIX与此关系不大。
请注意,regex.h中缺少此错误!在您的示例中,由于您将空字符串作为模式传递,因此有一个空/null字符串匹配。下面是我在 source code中发现的内容
某些模式的
,例如这里的
(a?)?**,**p+j指向
模式的末尾。我们不想推动这样的观点,
因为当我们在上面恢复它时,输入开关将
超过模式末尾的增量p。我们不需要
推动这一点,因为我们显然不会找到更多
pend之外的快速映射条目。这样的模式可以与匹配
不过,对空字符串执行。
因此,如果执行单个搜索,则空模式匹配输入字符串中第一个符号之前的空字符串,如果执行全局搜索,则匹配所有符号之前的所有空字符串。
发布于 2015-12-10 05:55:53
空正则表达式与空字符串匹配。如果搜索字符串是空字符串,则匹配整个内容。如果所述搜索串不为空,则匹配所述搜索串的每个字符之间的空串。
发布于 2015-12-10 06:32:01
我猜"“将占用内存中的1个字节,即"\0",而"any_string_here”在内存中看起来像"any_string_here\0“,所以"\0”总是与"any_string_here\0“匹配。
https://stackoverflow.com/questions/34188879
复制相似问题