5

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

https://www.rfc-editor.org/rfc/rfc3986#appendix-B

我正在尝试像这样编译它:

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

但我被 regcomp 的返回值困住了:

REG_BADRPT

人说,这意味着:

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

这个人的类似含义:

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

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

4

1 回答 1

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;
}

输出

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

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

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

   OK :^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
于 2013-03-03T00:56:38.200 回答