TR1正则表达式:捕获组?

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://"

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"

不支持向后查找。你需要通过使用捕获组来解决这个限制: 使用模式(http://)([[:alpha:]]\r\n)并仅获取第二个捕获组。


最后一段可能帮助最多。 - T. Webster
为了模拟后顾之约,您可以使用ECMAScript语法中的非捕获组,这样您就不需要进行不必要的捕获:(?:http://([[:alpha:]]\r\n)) - Pezo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接