RegEx:从多个串联的HTML文件中获取内容

时间:2018-11-14 19:46:01

标签: regex html-parsing regex-negation regex-lookarounds

我有一堆我想要合并的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

中工作

我目前的方法是基于逆匹配/正则表达式(我知道,围绕该主题有很多关于措词/方法/丑陋性的讨论,但是我不必担心,因为我需要完成工作):

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">

很好,但还没有。无论我在尝试什么,我都会陷入其他问题。我猜菜鸟在工作。

非常感谢您的帮助!

克里斯

编辑: 感谢您的第一个答案!但是,我必须承认,我的最小示例有点误导(因为太容易了)。实际上,我面临着数百个复杂而多样的html文件,它们组合成一个大文件。 唯一的共同点是,每个html文件的内容都以已知字符串(在此简化为)开头,并以已知字符串(在此简化为)结束。这样的内容显然具有不同的标签等负载。因此,仅测试打开和关闭标签并不会削减

1 个答案:

答案 0 :(得分:1)

您可能会寻找

(?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">字符序列(也称为tempered greedy token
    • $-字符串的结尾。