5

ここから正規表現を使用したいと思います。

https://www.rfc-editor.org/rfc/rfc3986#appendix-B

私はそれを次のようにコンパイルしようとしています:

#include <regex.h>
...
regex_t regexp;
if((regcomp(&regexp, "^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?", REG_EXTENDED)) != 0){
    return SOME_ERROR:
}

しかし、私はregcompの戻り値で立ち往生しています:

REG_BADRPT

によると、それは意味します:

*最初の文字として使用するなど、繰り返し演算子の使用が無効です。

この男で同様の意味:

?*または+前に有効な正規表現がない

私は自分の正規表現を使用してパーサーを作成しましたが、公式にはrfcにあるため、これもテストしたいと思います。ただし、検証に使用するつもりはありません。

4

1 に答える 1

3

\\Oli Charlesworthが提案したように、疑問符のバックスラッシュをエスケープする必要があります\?。詳細については、C++エスケープシーケンスを参照してください。

テストプログラム

#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 :^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
于 2013-03-03T00:56:38.200 に答える