正则表达式:从多个串联的 HTML 文件中获取内容

RegEx: Get content from multiple concatenated HTML-Files

我有一堆 html 文件,我连接这些文件并只想获取实际内容。 但是,我在为此找到正确的正则表达式时遇到了一些麻烦。基本上我试图删除某些边界之前、之间和之后的所有内容。它有点类似于 Regular expression to match a line that doesn't contain a word? 但是因为我觉得更复杂。我运气不好。

源数据:

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

工作

我目前的方法是基于反向匹配/正则表达式环视(我知道,围绕这个主题有很多关于 wording/methods/uglyness 等的讨论,但是我不在乎,因为我需要完成工作) :

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

还有更多变体,我一直在测试和尝试。 但是,它产生:

blablabla11
blablabla12

<div id="start">

blablabla21
blablabla22

<div id="start">

blablabla31
blablabla32

<div id="start">

很好,但还没有。无论我在尝试什么,我都会遇到其他问题。我猜是新手在工作。

非常感谢你们的帮助!

克里斯

编辑: 感谢您的第一个答案!但是我必须承认我的最小示例有点误导(因为太简单了)。实际上,我面临着大量复杂多样的 html 文件,这些文件连接成一个大文件。 唯一的共同点是每个 html 文件的内容都以已知字符串(此处简化为 )开头,并以已知字符串(此处简化为 )结尾。而且内容本身显然有很多不同的标签等。所以遗憾的是,仅仅测试开始和结束标签不会削减它

您可以寻找

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

并替换为 \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"> 字符序列(又名
    • $ - 字符串结尾。