【发布时间】:2019-01-27 20:42:09
【问题描述】:
我有一个 XML 文件,其中包含一些分页符处理指令。很多次 - 这些都是重复的。由于程序限制,我们不能有重复。解决方法是删除重复项。
从 XML 中提取
<cl:sect2 number="nonumber" identifier="c21_sect2-16">
<cl:complex-meta>
<cl:title identifier="NHBTUL192190904">title</cl:title>
</cl:complex-meta>
<cl:para identifier="YIGECN781336101">text in a para</cl:para>
<cl:para identifier="YIGECN781337102">text in a para</cl:para>
<cl:para identifier="YIGECN781337103">text in <?XSL PageEnd _567?> a para</cl:para>
<cl:para identifier="YIGECN781337101">text in a para</cl:para>
<?XSL PageEnd _568?>
<cl:para identifier="YIGECN781337102">text in a para</cl:para>
<cl:para identifier="YIGECN781337103">text in a para</cl:para>
<cl:figure number="numbered" position="fixed" identifier="FQOPWK022337863">
<cl:simple-meta>
<cl:title identifier="GIUSIS006030261">title text</cl:title>
</cl:simple-meta>
<cl:metadata-wrapper>
<cl:descriptive-media-meta>
<cl:media-term>Image</cl:media-term>
</cl:descriptive-media-meta>
</cl:metadata-wrapper>
<cl:media identifier="SUJESI135995607">
<cl:media-object media-size="page" height="550" width="206" units="pixel" link-target="95.jpg" identifier="UXNAAI395621596" asset-id="UXNAAI395621596"/>
</cl:media>
</cl:figure>
<?XSL PageEnd _568?>
<cl:para identifier="ECILBA810445866">text in a para</cl:para>
</cl:sect2>
在上面的sn-p中,<?XSL PageEnd _568?>是重复标签。
我有一个想法,可以通过正则表达式搜索和替换来解决这个问题。
我开始考虑以下...
搜索:(<\?XSL PageEnd _[[:alnum:]]+\?>)(?s:.*)\1
替换:$1$2
在非常小的规模上,在完美的场景中少于 10 个实例;我相信正则表达式可能能够完成这项工作
我遇到了问题:
- 在我给定的示例中,换行文本不起作用。
- 运行整个文件(其中 可能包含超过 1,000 个)。
- 如果 PageEnd 标记重复两次以上。 (176, 176, 176)
- 如果 PageEnd 标记重复,但其他页面也可能在 (176, 177, 177, 176, 176) 之间重复
我认为正则表达式是一个好的开始 - 但它只是无法仅在 Notepad++ 中远程完成这项任务。
如果有人可以帮助我指出我可以开始深入研究的方向,我将不胜感激。虽然它可能不完全适用,但我有 VB 和 VBA 的经验以及一点 PowerShell 的经验。
提前致谢!!
【问题讨论】:
-
您能否向我们展示一下您的 4 行示例数据的输出结果?顺便说一句,我不确定单独的正则表达式可以/应该处理这个问题。
-
仅供参考,灾难性回溯来自这样一个事实,即对于匹配
<\?XSL PageEnd _[[:alnum:]]+\?>的每一行,您当前的正则表达式将与文件的其余部分匹配.*然后回溯,直到它可以匹配初始的最新副本行。 -
没有看到你想要做什么,任何人都很难帮助你。
-
@TimBiegeleisen 我已更新问题以展示更好的示例。
-
如果可能出现多个
<\?XSL PageEnd,您可能需要先行进行重叠。假设每一行都以<开头或包含空格,并且在<?XSL PageEnd _之间没有其他行以<?开头,尝试这样并替换为$2,而不使用点匹配换行选项:@ 987654321@
标签: regex search replace duplicates