为什么这个正则表达式不能编译
Why this regular expression will not compile?
我想从这里使用正则表达式:
https://www.rfc-editor.org/rfc/rfc3986附录b
我试着像这样编译它:
#include <regex.h>
...
regex_t regexp;
if((regcomp(®exp, "^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(?([^#]*))?(#(.*))?", REG_EXTENDED)) != 0){
return SOME_ERROR:
}
但我坚持与regcomp的返回值:
REG_BADRPT
根据man,它的意思是:
重复操作符的无效使用,例如使用*
作为第一个字符。
同样的意思在这个人:
?
, *
或+
前面没有有效的正则表达式
我使用自己的正则表达式编写了解析器,但我也想测试一下这个,因为它正式在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;
}
ERROR :^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(?([^#]*))?(#(.*))?
OK :^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(?([^#]*))?(#(.*))?
regex中的?
是REG_BADRPT错误的来源。它被转化为?
。如果你用\?
替换它,regcomp将能够编译你的正则表达式。
"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?"
OK :^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(?([^#]*))?(#(.*))?
相关文章:
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么使用 std::vector 的代码不能编译,但使用 std::unique_ptr 如果没有 noexcept
- 为什么我不能编译这个在Cygwin的Visual Studio中编写的C++文件?
- 为什么我不能编译这个简单的线程测试?
- 为什么 --string::end() 可以编译,而 --string.size() 不能编译?
- 为什么G 5.4不能编译此编译时质数代码
- 为什么最简单的模板模板不能编译
- 为什么这个 c++ 代码不能编译?
- 为什么我不能编译这个开源项目
- 为什么 g++ 不能编译一个简单的 GTK 程序?
- C++。为什么我不能编译此代码?使用const_cast去除恒常性有什么问题?
- 为什么这个模板函数不能编译C++
- 托管类型的成员函数不能编译为非托管函数
- 为什么这个简单的C++程序不能编译?
- 为什么这个C++代码不能编译
- 为什么没有enable_if就不能编译
- 使用重载的operator=不能编译
- CodeRunner——不能编译多个源c++程序
- 为什么[]可变{}不能编译
- 为什么自建的g++编译器不能编译我的代码