我正在使用TR1 Regular Expressions(对于VS2010)而我正在尝试做的是搜索名为“name”的组的特定模式,以及名为“value”的组的另一种模式。我认为我想要的是一个捕获组,但我不确定这是否是正确的术语。我想将匹配分配给模式“[^:\ r \ n] +):\ s”到名为“name”的匹配列表,并匹配模式“[^ \ r \ n] +)\ r \ n” \ n)+“到名为”value“的匹配列表。
我到目前为止的正则表达式是
string pattern = "((?<name>[^:\r\n]+):\s(?<value>[^\r\n]+)\r\n)+";
但是程序运行时正则表达式T4R1标头不断抛出异常。我的模式的语法有什么问题?有人可以展示一个可以做我想要完成的事情的示例模式吗?
此外,如何在模式中包含一个匹配的子字符串,但实际上不包括结果中的子字符串?例如,我想匹配模式的所有字符串
"http://[[:alpha:]]\r\n"
,但我不想在返回的匹配结果中包含子字符串“http://”。
答案 0 :(得分: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)
并仅抓取第二个捕获组。