我有一堆我想要合并的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文件的内容都以已知字符串(在此简化为)开头,并以已知字符串(在此简化为)结束。这样的内容显然具有不同的标签等负载。因此,仅测试打开和关闭标签并不会削减
答案 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)$
-字符串的结尾。