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

rlu*_*uks 5 c++ regex

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

https://tools.ietf.org/html/rfc3986#appendix-B

我试图像这样编译它:

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

但是我坚持使用regcomp的返回值:

REG_BADRPT
Run Code Online (Sandbox Code Playgroud)

根据男人的意思是:

使用重复运算符无效,例如使用*第一个字符.

这个男人有类似的意思:

?,*或者+没有有效的正则表达式

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

Dav*_* L. 3

正如 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;
}
Run Code Online (Sandbox Code Playgroud)

输出

ERROR :^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(?([^#]*))?(#(.*))?
   OK :^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
Run Code Online (Sandbox Code Playgroud)

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

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

   OK :^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
Run Code Online (Sandbox Code Playgroud)