Список именованных захватов / групп в регулярном выражении

Я хочу знать, как я могу получить имя (я) группы захвата в регулярном выражении в boost.

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

Например, если входная строка:

(?<year>[0-9]{4}).*(?<month>[0-9]{2}).*(?<day>[0-9]{2})

Я хочу быть в состоянии извлечь «год», «месяц» и «день» из регулярного выражения.

1

Решение

Вы можете использовать следующее регулярное выражение:

"\?<([^<>]+)>"

Я не думаю, что движки регулярных выражений предоставляют такую ​​возможность, чтобы дать вам имена захваченных групп перед компиляцией регулярного выражения, потому что он должен пройти один раз перед входным регулярным выражением, прежде чем анализировать (и компилировать) регулярное выражение, что не является оптимальным методом, если только он компилирует регулярное выражение один раз и выполняет все задания вместе.

Итак, что касается вашего комментария, если возможно, что у вас есть неназванная группа, вам лучше перебрать захваченные группы и посмотреть, есть ли у нее имя или нет.

Обратите внимание, что, возможно, вы могли бы проанализировать случаи, в которых есть неназванные группы, с регулярным выражением, но я не думаю, что это общий способ.

Например, вы можете использовать вышеупомянутое регулярное выражение в скобках, чтобы захватить все группы, в которых нет другой группы захвата ([^()]* будет гарантировать, что):

`\((\?<([^<>]+)>)[^()]*\)`

А для других случаев вы должны написать еще один.

0

Другие решения

Других решений пока нет …