3

私はTR1正規表現(VS2010用)を使用しています。私がやろうとしているのは、「名前」というグループの特定のパターンと、「値」というグループの別のパターンを検索することです。私が欲しいのはキャプチャグループと呼ばれていると思いますが、それが正しい用語かどうかはわかりません。パターン「[^:\ r \ n] +):\ s」への一致を「name」と呼ばれる一致のリストに割り当て、パターン「[^ \ r \ n] +)\rの一致を割り当てたい\ n)+"を"value"と呼ばれる一致のリストに追加します。

私がこれまでに持っている正規表現パターンは

string pattern = "((?<name>[^:\r\n]+):\s(?<value>[^\r\n]+)\r\n)+";

ただし、プログラムの実行時に正規表現T4R1ヘッダーが例外をスローし続けます。私が持っているパターンの構文の何が問題になっていますか?誰かが私が達成しようとしていることを実行するパターンの例を示すことができますか?

また、一致するようにパターン内に部分文字列を含めることはできますが、実際にはその部分文字列を結果に含めないでください。たとえば、パターンのすべての文字列を一致させたい

"http://[[:alpha:]]\r\n"

、しかし、返される一致の結果に部分文字列「http://」を含めたくありません。

4

1 に答える 1

7

C++ TR1 および C++11 の正規表現文法は、名前付きキャプチャ グループをサポートしていません。名前のないキャプチャ グループを実行する必要があります。

また、エスケープの問題に遭遇しないようにしてください。一部の文字を 2 回エスケープする必要があります。1 つは C++ 文字列内にあり、もう 1 つは正規表現内にあるためです。パターン(([^:\r\n]+):\s\s([^\r\n]+)\r\n)+は、次のように C++ 文字列リテラルとして記述できます。

"([^:\\r\\n]+:\\s\\s([^\\r\\n]+)\\r\\n)+"
// or in C++11
R"xxx(([^:\r\n]+:\s\s([^\r\n]+)\r\n)+)xxx"

後読みもサポートされていません。キャプチャ グループを使用して、この制限を回避する必要があります。パターンを使用して(http://)([[:alpha:]]\r\n)、2 番目のキャプチャ グループのみを取得します。

于 2011-06-18T20:18:16.817 に答える