我想从这里使用正则表达式:
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 次 |
| 最近记录: |