Используйте содержимое класса внутри REGEX - PullRequest
0 голосов
/ 17 февраля 2019

Я хочу проанализировать вложенную структуру, подобную этой, в MATLAB:

structure NAME_PART_1
    Some content

    block NAME_PART_2
        Some other content
    end NAME_PART_2

    block NAME_PART_3
        subblock NAME_PART_4
            Some content++
        end NAME_PART_4
    end NAME_PART_3

end NAME_PART_1

structure           
    NAME_PART_5

end        NAME_PART_5

Сначала я бы хотел извлечь содержимое каждой структуры.Это довольно просто, потому что содержимое структуры всегда находится между «Именем структуры» и «Именем конца».

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

Итак, я написал свое регулярное выражение так:

\bstructure\s+([\w.-]*)((?:\s|.)*)\bend\b\s+XXXX

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

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Помимо использования обратной ссылки \1 для ссылки на захваченное, вы можете заменить чередование в группе захвата ((?:\s|.)*) совпадением с новой строкой, за которым следуют 0+ символов, и повторить это при захвате ((?:\n.*)+)

Также вы можете опустить границу слова после конца end\b\s+, так как 1+ пробельные символы - это то, что следует после конца, и вместо этого добавить границу слова в конце, чтобы \1 не было частью большего соответствия.

\bstructure\s+([\w.-]+)((?:\n.*)+)\bend\s+\1\b

Regex demo

Объяснение

  • \bstructure\s+ Структура соответствия, за которой следуют 1+ пробельных символов
  • ([\w.-]+) Захват в группе, повторяющейся 1+ раз на любом из перечисленных символов
  • ( Захват группы
    • (?:\n.*)+ Совпадение с новой строкой, за которым 0+ раз встречается любой символкроме новой строки
  • ) Закрыть группу захвата
  • \bend Конец матча
  • \s+\1\b Совпадение 1+ раз символ пробела с последующимобратная ссылка на группу 1 и заканчивается границей слова.
0 голосов
/ 17 февраля 2019

Попробуйте это регулярное выражение:

structure\s+([\w.-]+)\s*((?:(?!end\s+\1)[\s\S])*)end\s+\1

Нажмите для демонстрации

Объяснение:

  • structure - соответствует structure
  • \s+ - соответствует 1+ появлению пробела
  • ([\w.-]+) - соответствует 1+ появлению любого символа словаили . или -.Это вспомогательное совпадение, содержащее имя структуры, занято в Группе 1.
  • \s* - соответствует 0+ появлений пробела
  • ((?:(?!end\s+\1)[\s\S])*) - Закаленный жадный токен - соответствует 1+ вхождений любого символа [\s\S], который не начинается с последовательности end, за которой следует содержимое группы 1 \1, то есть имя структуры.Это совпадение фиксируется в группе 2, которая содержит содержимое структуры
  • end\s+\1 - соответствует слову end, за которым следует 1+ пробелов, за которыми следует имя структуры, содержащееся в группе 1 \1.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...