2011-06-18 9 views
3

私はTR1 Regular Expressions(VS2010用)を使用しています。私がしようとしているのは、「名前」というグループの特定のパターンと「値」というグループの別のパターンを検索することです。私が望むのは、キャプチャグループと呼ばれていますが、正しい用語であるかどうかはわかりません。 "[^:\ r \ n] +):\ s"のパターンを "name"という名前の一致リストに割り当て、パターン "[^ \ r \ n] +)\ rにマッチさせたい\ n)+ "を"値 "と呼ばれる一致のリストに追加します。TR1 regex:キャプチャグループ?

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

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

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

また、一致するパターン内に部分文字列を含めることは可能ですが、実際にはその部分文字列を結果に含めることはできません。例えば、私はパターン

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

のすべての文字列を一致させたいが、私はサブ「のhttp://」を含めたくない試合の返される結果に。

答えて

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" 

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

+0

最後の段落がおそらく最も役立ちました。 –

関連する問題