我想从这里使用正则表达式:
https://tools.ietf.org/html/rfc3986#appendix-B
我正在尝试像这样编译它:
#include <regex.h>
...
regex_t regexp;
if((regcomp(®exp, "^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?", REG_EXTENDED)) != 0){
return SOME_ERROR:
}
但我坚持使用regcomp的返回值:
REG_BADRPT
根据man,它意味着:
无效使用重复运算符,例如使用*
作为第一个字符。
此man的相似含义:
?
,*
或+
前面没有有效的正则表达式
我使用自己的正则表达式编写了解析器,但我也想测试这个,因为它正式在rfc中。我不打算用它进行验证。
答案 0 :(得分:3)
正如Oli Charlesworth建议的那样,你需要为问号\\
转义反斜杠\?
。有关详细信息,请参阅C ++ escape sequences。
测试计划
#include <regex.h>
#include <iostream>
void test_regcomp(char *rx){
regex_t regexp;
if((regcomp(®exp, 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 :^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?