Как я могу написать регулярное выражение для многократного захвата группы в пределах большего соответствия? - PullRequest
1 голос
/ 30 марта 2011

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

OpenMarker
    keyword some expression
    keyword some expression
    keyword some expression
    keyword some expression
    keyword some expression
CloseMarker

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

Я использую grepWin, который, кажется, поддерживает все навороты.

Ответы [ 3 ]

3 голосов
/ 30 марта 2011

Вы можете использовать:

(?<=OpenMarker((?!CloseMarker).)*)keyword(?=.*CloseMarker)

, это будет соответствовать keyword внутри OpenMarker и CloseMarker (используя опцию "точка соответствует новой строке").

0 голосов
/ 30 марта 2011

Существует только несколько механизмов регулярных выражений, которые поддерживают отдельные записи повторяющейся группы (например, .NET).Поэтому лучше всего сделать это в два этапа:

Сначала сопоставьте интересующий вас раздел: OpenMarker(.*?)CloseMarker (используя опцию «точка соответствует новой строке»).

Затем применитеповторное регулярное выражение для совпадения: keyword (.*) (на этот раз без опции «точка соответствует новой строке»).

0 голосов
/ 30 марта 2011

sed -n -e '/OpenMarker[[:space:]]*CloseMarker/p' /path/to/file | grep keyword должно работать. Не уверен, что один только 1002 может это сделать.

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