Исключить подвыражение из регулярного выражения в c ++ - PullRequest
4 голосов
/ 13 июня 2010

Предположим, я пытался сопоставить следующее выражение, используя regex.h в C ++, и пытался получить содержащиеся подвыражения:

/^((1|2)|3) (1|2)$/

Предположим, оно сопоставлялось со строкой "3 1", подвыражениябыло бы:

"3 1"
"3"
"1"

Если бы вместо этого было сопоставлено со строкой "2 1", подвыражения были бы:

"2 1"
"2"
"2"
"1"

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

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

Спасибо

Ответы [ 2 ]

3 голосов
/ 13 июня 2010

Существует два распространенных подхода к решению этой проблемы:

  • Именованные группы захвата: (?P<name>), так что вы можете явно извлекать захваченные группы по имени.
  • Группы без захвата, обычно: (?: blah), так что группа не становится частью результирующего списка групп, а остальные остаются в ожидаемом порядке.

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

Включение (1 | 2)группа в не захватывающую группу будет выглядеть так:

/^((?:1|2)|3) (1|2)$/
1 голос
/ 13 июня 2010

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

/^((?:1|2)|3) (1|2)$/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...