Захват нескольких строк текста после заголовка

Я пытаюсь создать регулярное выражение, чтобы получать тексты после определенного заголовка. Числа в строках после заголовка случайны. Также неизвестны имена Header2 и Header3.
Дело в том, что мне нужно захватить только тексты после Header1, потому что есть похожие тексты после других заголовков, которые не должны быть захвачены. Я пробовал следующее:

Header1\n(?:\s{4}(.+\:\s+.*)){1} //Captures -->  a:   fileAa2
Header1\n(?:\s{4}(.+\:\s+.*)){2} //Captures --> b:   fileB-
Header1\n(?:\s{4}(.+\:\s+.*)){3} //Captures --> cb:  fileCl

Но мне нужно вручную изменить число между фигурными скобками... так что, возможно, вы можете помочь мне найти лучший способ, текст выглядит следующим образом:

Header1
    ab:  fileAa2
    b:   fileB-
    cb:  fileCl
    ab:  fileD'
    b:   fileFn
Header2
    ab:  fileAa2
    a:   .file2
    ab:  file3/a
    a:   file4
    x:   file5
Header3
    LL
    pkg
    e
    f

Цель, которую я хочу заархивировать, состоит в том, чтобы иметь массив, подобный следующему, используя регулярное выражение с match или exec:

[ab:  fileAa2,  b:   fileB-, cb:  fileCl, ab:  fileD', b:   fileFn]

и после этого я буду фильтровать данные по префиксу следующим образом:

[fileAa2, fileD']
[fileB-, fileFn]
[fileCl]

Пожалуйста, любые предложения приветствуются

stackoverflow.com/editing-help, если у вас возникли проблемы с уценкой, например. новые строки. Не беспокойтесь о своем английском, он достаточно хорош и лучше, чем у некоторых.
Yunnosch 19.07.2019 08:22

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

Yunnosch 19.07.2019 08:27

Хорошо, спасибо за ваши наблюдения

Delm 19.07.2019 08:38

Строки, которые должны совпадать, заканчиваются новой строкой? Или возможно, что последняя строка Header1 также является самой последней строкой в ​​​​файле и не сопровождается новой строкой? Например, принятый в настоящее время ответ не будет работать для последней строки в файле без новой строки в конце.

Yunnosch 19.07.2019 08:38

Я пытаюсь отфильтровать вывод git status, поэтому есть заголовки, а после этого данные, которые я хочу получить, я только что проверил, и это не последняя строка, но я очень ценю ваше наблюдение.

Delm 19.07.2019 08:46
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
241
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете посмотреть примерно так: Header1\n(((.+?:\s+.+?)\n)+)(пример здесь)

Учитывая следующий текст:

Header1
    ab:  fileAa2
    b:   fileB-
    cb:  fileCl
    ab:  fileD'
    b:   fileFn
Header2
    ab:  fileAa2
    a:   .file2
    ab:  file3/a
    a:   file4
    x:   file5
Header3
    LL
    pkg
    e
    f

Он должен соответствовать:

ab:  fileAa2
b:   fileB-
cb:  fileCl
ab:  fileD'
b:   fileFn

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

Это рабочий и продемонстрированный ответ. Зачем использовать слабое «должен»? Это ДЕЙСТВИТЕЛЬНО соответствует тому, что показано для данного примера ввода.

Yunnosch 19.07.2019 08:31
Ответ принят как подходящий

С этим регулярным выражением (которое я придумал и протестировал на демонстрационной странице npinti, спасибо)

Header1\n((\s.+\n)+\s.+[^\n])

вы можете заменить Header1 на Header2 или Header3, и это тоже сработает.

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

Предполагается, что строки совпадают
начните с пробела (\s.+)
заканчиваться новой строкой(\n),
возможно несколько раз(+),
с последней строкой в ​​конце, начинающейся с пробела (\s.+) но заканчивается чем-то другим, кроме новой строки ([^\n]).

Последний бит избегает сопоставления со следующим заголовком (который начинается с букв вместо пробела) и получает самую последнюю строку, если она является частью целевого заголовка.

Другие вопросы по теме