Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 正则表达式删除除模式最后一次出现之外的所有行_Regex_Vim - Fatal编程技术网

Regex 正则表达式删除除模式最后一次出现之外的所有行

Regex 正则表达式删除除模式最后一次出现之外的所有行,regex,vim,Regex,Vim,我想删除除最后一次出现之外与图案匹配的所有线条。 假设我们有这样的文本: test a 043 test a 123 test a 987 test b 565 我的目标是: test a 987 test b 565 可以将这样的字符串与vim中的正则表达式进行比较吗?这也是假设本例中的a和b是动态的((test\s\w\s(.*))。您需要在vim中使用一个lookahead regex来实现: :g/\v(^test \w+)(\_.*\1)@=/d 正则表达式分解: \v

我想删除除最后一次出现之外与图案匹配的所有线条。 假设我们有这样的文本:

test a 043
test a 123
test a 987 
test b 565
我的目标是:

test a 987 
test b 565

可以将这样的字符串与vim中的正则表达式进行比较吗?这也是假设本例中的
a
b
是动态的(
(test\s\w\s(.*)
)。

您需要在vim中使用一个lookahead regex来实现:

:g/\v(^test \w+)(\_.*\1)@=/d
正则表达式分解:

\v            # very magic to avoid escapes
(             # capturing group #1 start
   ^test \w+  # match any line starting with test \w+
)             # capturing group #1 end
(\_.*\1)@=    # positive lookahead to make sure there is at least one of \1 below

非常好的动态长度前瞻用法!+1看起来不错,谢谢。你能解释一下
\
@=
在这种情况下是怎么做的吗?@F.Rakes如果我是你,我会先试试
:h\\\和:h\=
非常有趣,我不知道这些,谢谢@Kent。