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