为什么这个正则表达式不能编译

Why this regular expression will not compile?

本文关键字:不能 编译 正则表达式 为什么      更新时间:2023-10-16

我想从这里使用正则表达式:

https://www.rfc-editor.org/rfc/rfc3986附录b

我试着像这样编译它:

#include <regex.h>
...
regex_t regexp;
if((regcomp(&regexp, "^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(?([^#]*))?(#(.*))?", REG_EXTENDED)) != 0){
    return SOME_ERROR:
}

但我坚持与regcomp的返回值:

REG_BADRPT

根据man,它的意思是:

重复操作符的无效使用,例如使用*作为第一个字符。

同样的意思在这个人:

?, *+前面没有有效的正则表达式

我使用自己的正则表达式编写了解析器,但我也想测试一下这个,因为它正式在rfc中。我不打算用它来验证。

正如Oli Charlesworth所建议的,您需要为问号?转义反斜杠\。有关更多信息,请参见c++转义序列。

测试程序

#include <regex.h>
#include <iostream>
void test_regcomp(char *rx){
 regex_t regexp;
 if((regcomp(&regexp, rx, REG_EXTENDED)) != 0){
    std::cout << "ERROR :" << rx <<"n";
 }
 else{
   std::cout <<  "   OK :"<< rx <<"n";
 }
}
int main()
{
  char *rx1 = "^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(?([^#]*))?(#(.*))?" ;
  char *rx2 = "^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?" ;
   test_regcomp(rx1);
   test_regcomp(rx2);
   return 0;
}

ERROR :^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(?([^#]*))?(#(.*))?
   OK :^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(?([^#]*))?(#(.*))?

regex中的?是REG_BADRPT错误的来源。它被转化为?。如果你用\?替换它,regcomp将能够编译你的正则表达式。

"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?"
   OK :^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(?([^#]*))?(#(.*))?