【问题标题】:Regex searching for a way to remove duplicate processing instructions from code正则表达式搜索从代码中删除重复处理指令的方法
【发布时间】: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中,&lt;?XSL PageEnd _568?&gt;是重复标签。

我有一个想法,可以通过正则表达式搜索和替换来解决这个问题。

我开始考虑以下... 搜索:(&lt;\?XSL PageEnd _[[:alnum:]]+\?&gt;)(?s:.*)\1

替换:$1$2

在非常小的规模上,在完美的场景中少于 10 个实例;我相信正则表达式可能能够完成这项工作

我遇到了问题:

  1. 在我给定的示例中,换行文本不起作用。
  2. 运行整个文件(其中 可能包含超过 1,000 个)。
  3. 如果 PageEnd 标记重复两次以上。 (176, 176, 176)
  4. 如果 PageEnd 标记重复,但其他页面也可能在 (176, 177, 177, 176, 176) 之间重复

我认为正则表达式是一个好的开始 - 但它只是无法仅在 Notepad++ 中远程完成这项任务。

如果有人可以帮助我指出我可以开始深入研究的方向,我将不胜感激。虽然它可能不完全适用,但我有 VB 和 VBA 的经验以及一点 PowerShell 的经验。

提前致谢!!

【问题讨论】:

  • 您能否向我们展示一下您的 4 行示例数据的输出结果?顺便说一句,我不确定单独的正则表达式可以/应该处理这个问题。
  • 仅供参考,灾难性回溯来自这样一个事实,即对于匹配 &lt;\?XSL PageEnd _[[:alnum:]]+\?&gt; 的每一行,您当前的正则表达式将与文件的其余部分匹配 .* 然后回溯,直到它可以匹配初始的最新副本行。
  • 没有看到你想要做什么,任何人都很难帮助你。
  • @TimBiegeleisen 我已更新问题以展示更好的示例。
  • 如果可能出现多个&lt;\?XSL PageEnd,您可能需要先行进行重叠。假设每一行都以&lt; 开头或包含空格,并且在&lt;?XSL PageEnd _ 之间没有其他行以&lt;? 开头,尝试这样并替换为$2,而不使用点匹配换行选项:@ 987654321@

标签: regex search replace duplicates


【解决方案1】:

检查下一个正则表达式(?=(^&lt;\?XSL PageEnd _\d+\?&gt;$))(?&lt;=\1[\s\S]+)\1

要在线尝试正则表达式并获得解释,请点击here

但是这个正则表达式只适用于引擎,它支持在lookbehind内无限重复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 2019-08-12
    • 1970-01-01
    相关资源
    最近更新 更多