Использование звездочки в RegExp для извлечения данных, которые заключены в определенный шаблон - PullRequest
0 голосов
/ 20 января 2009

У меня есть текст, который состоит из информации, заключенной в определенный шаблон. Единственное, что я знаю, это шаблон: "$ {template.start}" и $ {template.end} Для простоты я заменим $ {template.start} и $ {template.end} на «a» в примере.

Таким образом, одна запись в тексте будет:

aINFORMATIONHEREa

Я не знаю, сколько из этих записей объединено в тексте. Таким образом, следующее тоже верно:

aFOOOOOOaaASDADaaASDSDADa

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

Моей первой попыткой было сделать:

a(.*)a

, который работает, пока в тексте есть только одна запись. Как только появляется более одной записи, происходит сбой, поскольку .* соответствует всему. Таким образом, использование a(.*)a на aFOOOOOOaaASDADaaASDSDADa приводит к получению только одной группы захвата, содержащей все между первым и последним символом текста, которые являются «a»:

FOOOOOOaaASDADaaASDSDAD

Я хочу получить что-то вроде

captureGroup(0):  aFOOOOOOaaASDADaaASDSDADa
captureGroup(1): FOOOOOO
captureGroup(2): ASDAD
captureGroup(3): ASDSDAD

Было бы здорово иметь возможность извлекать каждую запись из текста и из каждой записи информацию, заключенную между «а». Кстати, я использую класс QRegExp в Qt4.

Есть подсказки? Спасибо! Markus


Несколько вариантов этого вопроса были замечены ранее. Различные связанные обсуждения:

и, возможно, другие ...

Ответы [ 3 ]

5 голосов
/ 20 января 2009

Просто используйте не жадные выражения, а именно:

a(.*?)a
3 голосов
/ 20 января 2009

Вы должны соответствовать что-то вроде:

a[^a]*a
0 голосов
/ 20 января 2009

У вас уже есть пара рабочих ответов, но я добавлю небольшой бесплатный совет:

Использование регулярных выражений для разбора - дорога, чреватая опасностью

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

ТАК, выбор использования RE для анализа входных потоков - это решение, которое следует принимать с осторожностью и с глядом в будущее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...