【问题标题】:RegEx: Get content from multiple concatenated HTML-FilesRegEx:从多个连接的 HTML 文件中获取内容
【发布时间】:2019-04-17 20:43:25
【问题描述】:

我有一堆我连接的 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 文件的内容都以已知字符串(此处简化为 )开头,并以已知字符串(此处简化为 )结尾。而且这样的内容显然有很多不同的标签等。所以遗憾的是,仅仅测试打开和关闭标签不会削减它

【问题讨论】:

  • 尝试(?s).*?(&lt;div id="start"&gt;.*?&lt;div id="end"&gt;)(?:(?:(?!&lt;div id="start"&gt;).)*$)? 并替换为$1\n\n。见demo
  • 不确定 div 元素是什么,但你不能只使用 &lt;div id="start"&gt;.*?&lt;div id='end&gt; 这样的东西,它只是不能那样工作。此外,您只能使用正则表达式解析标签和不可见内容。您可以做的最好的事情是删除所有标签,但您不想这样做。
  • 您使用什么语言或正则表达式引擎?我也许可以给你一个模板正则表达式,你可以把东西放进去。
  • @WiktorStribiżew - 你太棒了,伙计!起初我忽略了你的评论,但它完美地工作,即使在我的真实文件中也是如此。完美,多么酷!你能帮我理解 (?:(?:(?!
    ).)*$) 吗?工作一天,我可以自己编写正则表达式而不是 C&P? ;))
  • 现在让我发布解释。

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


【解决方案1】:

你可以找

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

并替换为$1\n\n。见regex demo

详情

  • (?s) - DOTALL 修饰符,. 现在匹配任何字符
  • .*? - 任何 0+ 个字符,尽可能少
  • (&lt;div id="start"&gt;.*?&lt;div id="end"&gt;) - 第 1 组:&lt;div id="start"&gt;,任何 0+ 字符尽可能少,&lt;div id="end"&gt;
  • (?:(?:(?!&lt;div id="start"&gt;).)*$)? - 一个可选的非捕获组匹配 1 或 0 次出现
    • (?:(?!&lt;div id="start"&gt;).)* - 任何不以&lt;div id="start"&gt; 字符序列开头的字符,0 次或多次出现(又名tempered greedy token
    • $ - 字符串结束。

【讨论】:

  • 忘记在这里回答以表扬你:非常感谢,@Wiktor。您是正则表达式社区的真正资产!
猜你喜欢
相关资源
最近更新 更多
热门标签