简单的正则表达式问题(vim搜索/替换)

时间:2010-12-29 22:51:10

标签: regex vim vi

如何指定搜索中的字符串有多个选项? 例如,我想找到以jspParbtnjspAtt开头且以字母K结尾的任何组合。

另外 - 我需要用字符串替换它,具体取决于原始前缀。 例如,如果前缀为jspPar,我需要将其替换为字母P。 (并且,假设BA代表btnjspAtt

1 个答案:

答案 0 :(得分:5)

\(jsPar\|btn\|jspAtt\)[^ \t]*K

你在找什么?

\(jsPar\|btn\|jspAtt\)说“此时,匹配任何这些替代方案”,然后[^ \t]*说“此时,匹配任何数量(包括零)的空格或制表符”,以及K当然意味着“此时匹配K”。


对于您添加的问题可以执行以下操作:

%s/\(jsPar\|btn\|jspAtt\)[^ \t]*\zsK/\=submatch(1) == 'jsPar' ? 'P' : submatch(1) == 'btn' ? 'B' : 'A' /g

\zs表示“认为此时匹配已开始”,因此只会替换“K”。)

但是如果我 在一次传递中进行替换,我只会这样做。否则我只会运行三个s/// s:

%s/jspAtt[^ \t]*\zsK/A/g
%s/jsPar[^ \t]*\zsK/P/g
%s/btn[^ \t]*\zsK/B/g

鉴于命令历史记录,输入的次数要少得多,并且也不太可能需要调试,而在指定任何计算时,这总是一种潜力。

相关问题