替换非匹配字符正则表达式

时间:2014-09-13 11:30:56

标签: regex vim replace pattern-matching

我正在尝试创建一个正则表达式,用于替换不在搜索模式中的每个字符。

体育课。
输入

whatever text text and more text
test 2 12000 text and more text
text and text
text 3 text more text
1-2000 and more text

搜索模式:

let @/ = '^test \zs2 \d\d\d\d\d\s.*\n\(.*\n\)\{-}text 3\ze'

(从'2'之前到'3'之后的匹配)

我想将匹配之外的所有其他字符替换为字符_

预期输出

________________________________
_____2 text and more text
text and text
text 3_______________
_____________

我使用这个正则表达式工作正常,但如果搜索模式中有多行,则不起作用:

exe "%s/\\(@/\\)\\zs\\|./\\=submatch(1)!=''?'':'_'/g"   

如何在搜索模式中使用多行来使其工作?

2 个答案:

答案 0 :(得分:2)

Modyfing alpha bravo的解决方案并适应vim:

:%s/\(2\_.*3\)*[^\r\n]/\1_/g

应该做的伎俩。

这里的关键是\_.,它匹配任何字符,包括换行符 这相当于PCRE中的/s

答案 1 :(得分:1)

将此模式(2.*3)*[^\r\n]gs选项一起使用,并替换为$1_
Demo