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

时间:2013-03-02 23:45:02

标签: 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:
}

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

REG_BADRPT

根据man,它意味着:

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

man的相似含义:

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

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

1 个答案:

答案 0 :(得分:3)

正如Oli Charlesworth建议的那样,你需要为问号\\转义反斜杠\?。有关详细信息,请参阅C ++ escape sequences

测试计划

#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 :^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?