我想从这里使用正则表达式:
https://tools.ietf.org/html/rfc3986#appendix-B
我试图像这样编译它:
#include <regex.h>
...
regex_t regexp;
if((regcomp(®exp, "^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?", REG_EXTENDED)) != 0){
return SOME_ERROR:
}
Run Code Online (Sandbox Code Playgroud)
但是我坚持使用regcomp的返回值:
REG_BADRPT
Run Code Online (Sandbox Code Playgroud)
根据男人的意思是:
使用重复运算符无效,例如使用*
第一个字符.
这个男人有类似的意思:
?
,*
或者+
没有有效的正则表达式
我使用自己的正则表达式编写了解析器,但我也想测试这个,因为它正式在rfc中.我不打算用它进行验证.
正如 Oli Charlesworth 所建议的,您需要转义\\
问号的反斜杠\?
。有关详细信息,请参阅 C++转义序列。
测试程序
#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;
}
Run Code Online (Sandbox Code Playgroud)
输出
ERROR :^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(?([^#]*))?(#(.*))?
OK :^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
Run Code Online (Sandbox Code Playgroud)
正\?
则表达式中的 是 REG_BADRPT 错误的来源。它被转换为?
. 如果您将其替换为\\?
,则 regcomp 将能够编译您的正则表达式。
"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?"
OK :^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1409 次 |
最近记录: |