RegEx: Получить контент из нескольких сцепленных HTML-файлов - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть куча html-файлов, которые я объединяю и хочу получить только фактическое содержимое. Однако у меня возникли проблемы с поиском правильного регулярного выражения для этого. В основном я пытаюсь удалить все до, между и после определенных границ. Это немного похоже на Регулярное выражение, чтобы соответствовать строке, которая не содержит слова? однако, поскольку я чувствую себя более сложным. Мне не повезло.

Источник-данные:

Stuff I dont need before

<div id="start">
blablabla11
blablabla12
<div id="end">

Stuff I dont need in the middle1

<div id="start">
blablabla21
blablabla22
<div id="end">

Stuff I dont need in the middle2

<div id="start">
blablabla31
blablabla32
<div id="end">

Stuff I dont need in the end

Желаемый результат:

<div id="start">
blablabla11
blablabla12
<div id="end">

<div id="start">
blablabla21
blablabla22
<div id="end">

<div id="start">
blablabla31
blablabla32
<div id="end">

Контекст: Я работаю в Sublime (Mac) -> Perl Regex

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

Find: (?s)^((?!(<div id="start">)(?s)(.*?)(<div id="end">)).)*$
Replace: $3

И еще много вариантов, я тестировал и играл. Тем не менее, он дает:

blablabla11
blablabla12

<div id="start">

blablabla21
blablabla22

<div id="start">

blablabla31
blablabla32

<div id="start">

Хорошо, но пока нет. И что бы я ни пытался, я сталкиваюсь с другими проблемами. Думаю, нуб на работе.

Спасибо, gazillion за вашу помощь, ребята!

Chris

EDIT: Спасибо за первые ответы! Однако я должен признать, что мой минимальный пример немного вводит в заблуждение (потому что это слишком просто). В действительности я сталкиваюсь с сотнями сложных и разнообразных html-файлов, объединенных в один большой файл. Единственными общими битами являются то, что содержимое каждого html-файла начинается с известной строки (здесь упрощенно) и заканчивается известной строкой (здесь упрощенно как). И контент как таковой, очевидно, имеет множество различных тегов и т. Д. Так что, к сожалению, просто тестирование на открытие и закрытие тегов не обрежет его

1 Ответ

0 голосов
/ 15 ноября 2018

Вы можете искать

(?s).*?(<div id="start">.*?<div id="end">)(?:(?:(?!<div id="start">).)*$)?

и заменить на $1\n\n. См. regex demo .

Подробнее

  • (?s) - DOTALL модификатор, . теперь соответствует любому символу
  • .*? - любые 0+ символов, как можно меньше
  • (<div id="start">.*?<div id="end">) - Группа 1: <div id="start">, любые 0+ символов, как можно меньше, и <div id="end">
  • (?:(?:(?!<div id="start">).)*$)? - необязательная группа без захвата, соответствующая 1 или 0 появлению
    • (?:(?!<div id="start">).)* - любой символ, 0 или более вхождений, который не запускает последовательность символов <div id="start"> (он же закаленный жадный токен )
    • $ - конец строки.
...