Notepad ++ Regex:匹配第一个搜索结果(或第二个搜索结果)

时间:2016-09-11 16:11:24

标签: regex notepad++

我有这句话重复:

<ul class="lista_3">
<ul class="lista_3">
<ul class="lista_3">

它如何只匹配第一个搜索结果?我怎样才能匹配第二个搜索结果?

2 个答案:

答案 0 :(得分:2)

使用3个捕获组,你可以用1&#39;在文件中查找&#39;替换

例如:

找到:(<ul class="lista_3">)(\s+)(\1)(\s+\1)
替换为:<ul class="lista_1">\2<ul class="lista_2">\4
搜索模式:正则表达式

如果这些重复标签之间有文本(除换行之外),那么标签之间的文本也需要被捕获,因此可以在替换字符串中使用。

找到:(<ul class="lista_3">)(.*?)(\1)(?=.*?\1)
替换为:<ul class="lista_1">\2<ul class="lista_2">
搜索模式:正则表达式(已选中. matches newlines

请注意,这次使用了一个积极的前瞻 因为它不像最后一个需要更换 它只是检查那个反向引用的捕获组1的确是第3个。

但是,如果该组有更多重复,那么我认为应该在没有前瞻的情况下完成。

找到:(<ul class="lista_3">)(.*?)(\1)(.*?\1)
替换为:<ul class="lista_1">\2<ul class="lista_2">\4
搜索模式:正则表达式(已选中. matches newlines

答案 1 :(得分:2)

要匹配并替换第一个匹配项,您需要记住正则表达式引擎从左到右匹配,并且Notepad ++正则表达式引擎需要使用整个文档以便不在下一行重试。

启用 .匹配换行符选项并使用

<ul class="lista_3">(.*)\z

其中<ul class="lista_3">是文字文本,(.*)是ID为1的捕获组,匹配文档末尾的任何0+字符(\z)。请注意,如果您需要替换第一个匹配项,请使用<ul class="Moja_nowa_lista_1">$1之类的内容(其中$1是捕获值的反向引用)。

enter image description here

要匹配并替换第二个匹配项,您需要先匹配第一个匹配项,然后使用回火贪婪标记或惰性点匹配。

\A(.*?<ul class="lista_3">.*?)<ul class="lista_3">(.*)\z

或(带有顽固的贪婪令牌)

\A((?:(?!<ul class="lista_3">).)*<ul class="lista_3">(?:(?!<ul class="lista_3">).)*)<ul class="lista_3">(.*)\z

并替换为$1<ul class="Moja_nowa_lista_2">$2

enter image description here