我正在尝试创建一个正则表达式,用于替换不在搜索模式中的每个字符。
体育课。
的输入
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"
如何在搜索模式中使用多行来使其工作?
答案 0 :(得分:2)
Modyfing alpha bravo的解决方案并适应vim:
:%s/\(2\_.*3\)*[^\r\n]/\1_/g
应该做的伎俩。
这里的关键是\_.
,它匹配任何字符,包括换行符
这相当于PCRE中的/s
答案 1 :(得分:1)
将此模式(2.*3)*[^\r\n]
与gs
选项一起使用,并替换为$1_
Demo