Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有方法获取第一个不匹配字符';regexec调用后的位置_C_Regex - Fatal编程技术网

是否有方法获取第一个不匹配字符';regexec调用后的位置

是否有方法获取第一个不匹配字符';regexec调用后的位置,c,regex,C,Regex,在以下过于简化的代码示例中: reg = "^[0-9]{1,10}$"; str = "123abc"; regcomp(&re, reg, REG_EXTENDED); regexec(&re, str, 0, NULL, 0); 在regexec返回REG_NOMATCH后,我想获取导致匹配失败的字符的位置(上例中为3)。如果您想查看最后一个匹配的字符是什么,请尝试所有匹配的组合: int count=1; varReg=strdup("^[0-9]"); while

在以下过于简化的代码示例中:

reg = "^[0-9]{1,10}$";
str = "123abc";
regcomp(&re, reg, REG_EXTENDED);
regexec(&re, str, 0, NULL, 0);

regexec
返回
REG_NOMATCH
后,我想获取导致匹配失败的字符的位置(上例中为3)。

如果您想查看最后一个匹配的字符是什么,请尝试所有匹配的组合:

int count=1; 
varReg=strdup("^[0-9]");
while (works(varReg)){
   aux=varReg;
   varReg=malloc(strlen(varReg)+1);
   sprintf(varReg,"%s%d",aux, count++);
   free(aux)
}
fprint ("fail in: %d\n", --count);  

您需要构建
bool工作(char*regex)
但很简单;)

看来这真的不可能。

谢谢你的建议!我宁愿为正则表达式实现我自己的状态机-它至少会更有效。。。我正在寻找一种简单的方法来实现这一点-接下来我将检查libpcre是否允许获取此类信息。您的建议也可能适用于上述简单情况(仅sprintf需要“%s{%d}”,但想象一下,测试正则表达式要复杂得多——将给定的复杂正则表达式转换为只匹配前一个正则表达式语言前缀的正则表达式绝非易事。是的,状态机是正则表达式的工作方式。您可以更改并生成更复杂的代码。这个想法只是进行自动检查,数据是正确的我的代码只是一个例子,失败的数字超过9 malloc(strlen(varReg)+1);没有做出正确的保留,这会导致缓冲区溢出。