使用regcomp进行^ [az] {0,20000} $正则表达式编译的可怕性能

SCO*_*SCO 1 regex memory performance libc

我想知道为什么这样一个正则表达式的编译占用了我的RAM的70%,导致强烈的交换和16的负载平均值:

strcpy(regexStr,"^[a-z]{0,20000}$" );
regcomp( &regex , regexStr , REG_NOSUB | REG_EXTENDED );
Run Code Online (Sandbox Code Playgroud)

执行时间大约为几分钟(之前必须终止进程).^[a-z]{0,2000}$(2,000,而不是20,000)的执行大约是100ms,这对我来说很重要.

我用它来检查一个模式,同时检查长度.我发现正则表达式对两者都很方便.难道我做错了什么 ?

CAF*_*FxX 10

我建议使用strlen测量字符串长度,然后使用正则表达式/[^a-z]/来测试是否存在非字母字符.吻.

顺便说一句,不,我没有看到任何理由*为什么你会得到那种表现.

*很好的理由显然不包括错误或设计不佳......

编辑:事实证明,它可能实际上是一个糟糕的设计案例

edit2:因为你正在做的检查非常简单,你可以在普通的C中实现:

int i;
for (i=0; i<20000 && str[i]!=0; i++)
  if (str[i] < 'a' || str[i] > 'z')
    return -1;
return i;
Run Code Online (Sandbox Code Playgroud)

如果它返回-1,则该字符串包含范围az之外的字符; 如果返回20000,则字符串长度超过20000个字符; 否则返回字符串长度.(注意:这将只能用于非宽字符串)