TR1 регулярное выражение: захват групп? - PullRequest
3 голосов
/ 18 июня 2011

Я использую Регулярные выражения TR1 (для VS2010), и я пытаюсь найти конкретный шаблон для группы с именем "name" и другой шаблон для группы с именем "value" , Я думаю, что то, что я хочу, называется группа захвата , но я не уверен, что это правильная терминология. Я хочу назначить совпадения шаблону "[^: \ r \ n] +): \ s" списку совпадений с именем "name" и совпадениям шаблона "[^ \ r \ n] +) \ r \ n) + "к списку совпадений под названием" значение ".

Шаблон регулярного выражения, который у меня есть,

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

Но заголовок regex T4R1 продолжает выдавать исключение при запуске программы. Что не так с синтаксисом шаблона, который у меня есть? Может кто-нибудь показать пример шаблона, который будет делать то, что я пытаюсь сделать?

Кроме того, как можно включить подстроку в шаблон для сопоставления, но на самом деле не включить эту подстроку в результаты? Например, я хочу сопоставить все строки шаблона

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

, но я не хочу включать подстроку "http://" в возвращаемые результаты матчей.

1 Ответ

7 голосов
/ 19 июня 2011

Грамматики регулярных выражений 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) и захватывайте только вторую группу захвата.

...