【发布时间】:2016-12-11 12:49:29
【问题描述】:
我需要一个正则表达式来搜索和替换文本的分隔部分中多次出现的文本字符串。
假设有一个或多个具有特定类的跨度的 HTML 代码。每个 span 内部可能没有、出现一次或多次出现字符串 {abc},例如
<p>lorem ipsum dolor <span class="xyz">sid amet{abc}et pluribus {abc} unum{abc} diex
et mon droit</span> you'll never walk alone</p>
因此,我需要一个正则表达式对,将<span id="xyz"> 中出现的所有{abc} 替换为{def} 一次性。
这是用于Notepad++之类的文本编辑器,需要是PCRE/UNIX风格的正则表达式。
我所拥有的是,
查找:(<span class="xyz">)([^<]*)\{abc\}([^<]*<)
替换:\1\2{def}\3
这确实有效在一个范围内出现一次,但如果出现更多情况,我必须循环多次运行替换,而我需要它是一次通过。
我想知道我怎样才能做到这一点。我想这是一个很常见的情况,不知怎的,我找不到类似的事情,需要一次性,没有循环,没有代码,我想知道原则上如何做到这一点。
【问题讨论】:
-
那么,Notepad++ 还是哪个编辑器? Notepad++ 在搜索和替换中使用 PCRE,SublimeText 使用 Boost,TextMate 使用 Oniguruma。好吧,所有这些都支持
\G运算符,但前两个也支持有用的\K运算符。 -
您可以在 Notepad++ 中使用
\G,例如(?:<span class="xyz">|\G(?!^))(?:[^<{]*|\{(?!abc))\K\{abc\}。这没有经过适当的测试,并且会在嵌套标签上失败。此外,在正则表达式中处理 html 通常是个坏主意。 -
我会尝试类似
(<span class="xyz">|\G(?!^))((?:[^<{]|\{(?!abc\}))*)\{abc\}并替换为$1$2{def}以避免使用不那么广泛存在的\K。不过,这不是 Unix 正则表达式。 -
那么,它是用于 UltraEdit 的吗?应该有一个带有正则表达式风格的组合,并且必须有一个名为
Perl的选项 - 用于 PCRE 正则表达式。然后您可以使用(?:<span class="xyz">|(?!^)\G)(?:[^<{]|\{(?!abc\}))*\K\{abc\}并替换为{def}。 -
我能想到的最好的正则表达式,比如
(?:<span class="xyz">|(?!^)\G)(?:(?!</?span\b|\{abc\}).)*\K\{abc\},用{def}代替PCRE 正则表达式引擎。它不适用于嵌套的<span>标签,但支持<span>内的任何其他标签。
标签: html regex replace notepad++