3

我正在使用TR1 正则表达式(用于 VS2010),我正在尝试为名为“name”的组搜索特定模式,并为名为“value”的组搜索另一种模式。我想我想要的是一个捕获组,但我不确定这是否是正确的术语。我想将匹配模式“[^:\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 正则表达式语法不支持命名捕获组。您必须执行未命名的捕获组。

另外,请确保您不会遇到逃避问题。您必须对某些字符进行两次转义:一次是在 C++ 字符串中,另一次是在正则表达式中。该模式(([^:\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)并仅抓取第二个捕获组。

于 2011-06-18T20:18:16.817 回答