Я пытаюсь создать регулярное выражение, чтобы получать тексты после определенного заголовка. Числа в строках после заголовка случайны. Также неизвестны имена 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]
Пожалуйста, любые предложения приветствуются
Пожалуйста, покажите некоторый контекст кодирования, то есть код, в котором вы хотите использовать регулярное выражение. Иногда проще использовать некоторый код вокруг чистого регулярного выражения, особенно при просмотре многострочных совпадений. Может быть, сделать что-то вроде минимальный воспроизводимый пример.
Хорошо, спасибо за ваши наблюдения
Строки, которые должны совпадать, заканчиваются новой строкой? Или возможно, что последняя строка Header1 также является самой последней строкой в файле и не сопровождается новой строкой? Например, принятый в настоящее время ответ не будет работать для последней строки в файле без новой строки в конце.
Я пытаюсь отфильтровать вывод git status, поэтому есть заголовки, а после этого данные, которые я хочу получить, я только что проверил, и это не последняя строка, но я очень ценю ваше наблюдение.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете посмотреть примерно так: 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. Наличие имени заголовка нарушает этот шаблон, поэтому выражение возвращается с тем, что вы хотите (отбрасывая остальную часть содержимого).
Это рабочий и продемонстрированный ответ. Зачем использовать слабое «должен»? Это ДЕЙСТВИТЕЛЬНО соответствует тому, что показано для данного примера ввода.
С этим регулярным выражением (которое я придумал и протестировал на демонстрационной странице npinti, спасибо)
Header1\n((\s.+\n)+\s.+[^\n])
вы можете заменить Header1 на Header2 или Header3, и это тоже сработает.
Кроме того, это работает даже в том случае, если строки для сопоставления находятся в самом конце того, что вы обрабатываете, даже без окончательной новой строки.
Предполагается, что строки совпадают
начните с пробела (\s.+)
заканчиваться новой строкой(\n),
возможно несколько раз(+),
с последней строкой в конце, начинающейся с пробела (\s.+)
но заканчивается чем-то другим, кроме новой строки ([^\n]).
Последний бит избегает сопоставления со следующим заголовком (который начинается с букв вместо пробела) и получает самую последнюю строку, если она является частью целевого заголовка.