Regex захватывает имена блоков с отступами - PullRequest
1 голос
/ 30 июня 2019

Я пытаюсь выполнить регулярное выражение для строкового вывода, например

  awfjioawjeawef oiajweoifjawoief
  oiawjobjoia oiafwjeoifawjeiofw
Start of my Desired Text
  indented group 1                {some random text}
  indented group 2                {some random text}
    sub indented group 1          {some large random 
                                   ...
                                   text}
    sub indented group 2          {some random text}
  indented group 3
    sub indented group 3
  indented group 4                {some large random 
                                   ...
                                   text}
  indented group 5                {some random text}
End of my Desired Text
   non-indeted group1             {some random text}
   non-indented group2            {some large random 
                                   ...
                                   text}

В конечном итоге я хочу получить имена «групп с отступами», например:

['indented group 1', 'indented group 2', 'sub indented group 1', 'sub indented group 2', 'indented group 3', 'sub indented group 3', 'indented group 4', 'indented group 5']

Я пытаюсь использовать это регулярное выражение:

(\n\s+([\w\s\-\,]+).*\{)+

Однако я не могу получить его, как описано выше, где он заканчивается захватом за пределами «Начало моего желаемого текста» и «Конец»моего желаемого текста ".Любой совет?(вот ссылка на регулярное выражение https://regex101.com/r/LsxhlH/1/) Я хотел бы получить все в одном выражении регулярного выражения, в отличие от разбиения на несколько. Я не могу заставить субматч внутри матча работать очень хорошо.

1 Ответ

1 голос
/ 01 июля 2019

В основном это двухэтапная операция.

1.Получить текст между началом / концом нужного текста:

(?<=Start[ ]of[ ]my[ ]Desiried[ ]Text)[\S\s]+(?=End[ ]of[ ]my[ ]Desiried[ ]Text)

https://regex101.com/r/jj8hfQ/1

2.Используйте результат шага 1 и выполните глобальное регулярное выражение findall для этой строки соответствия, чтобы получить массив имен:

(?m)^[^\S\r\n]+([\w\s\-\,]+?)[^\S\r\n]*?(?:\{|\r?\n)

https://regex101.com/r/LkOIWt/1

Объяснено:

 (?m)                          # Multi-line mode
 ^                             # BOL
 [^\S\r\n]+                    # Required some horizontal whitespace (indent, trim)
 ( [\w\s\-\,]+? )              # (1), The indented name
 [^\S\r\n]*?                   # Trailing horizontal whitespace (trim)
 (?: \{ | \r? \n )             # Required, either a { or a linebreak
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...