假设我有一个字符串"快速的棕色狐狸跳过懒狗"我可以用一个正则表达式将其更改为"慢棕狐跳过精力充沛的狗"吗?目前,我为这种情况使用了两组正则表达式.(在这种情况下,我使用s/quick/slow/
后跟s/lazy/energetic/
.)
您可以使用词典在vim中执行此操作:
:%s/quick\|lazy/\={'quick':'slow','lazy':'energetic'}[submatch(0)]/g
这将更改以下文本:
在快速的棕色狐狸跑快速旁边LY 懒小溪.
成:
该慢的棕色狐狸跑慢旁光年充满活力的小溪.
要了解其工作原理,请参阅:help sub-replace-expression
和:help Dictionary
.简而言之,
\=
让你替换vim表达式的结果.
{'quick':'slow', 'lazy':'energetic'}
是[]
用于查找的vim字典(如perl或ruby中的哈希,或javascript中的对象).
submatch(0)
是匹配的字符串
重构代码时,这可以派上用场-说要交换的变量名foo
,bar
和baz
改变
foo
→ bar
bar
→ baz
baz
→ foo
%s///
除非你使用了临时变量名,否则使用一系列命令会很棘手 - 但是你必须确保它们没有碰到其他任何东西.相反,您可以使用Dictionary在一次传递中执行此操作:
:%s/\<\%(foo\|bar\|baz\)\>/\={'foo':'bar','bar':'baz','baz':'foo'}[submatch(0)]/g
哪个更改此代码
int foo = 0; float bar = pow(2.0, (float) foo); char baz[256] = {}; sprintf(baz,"2^%d = %f\n", foo, bar);
成:
int bar = 0; float baz = pow(2.0, (float) bar); char foo[256] = {}; sprintf(foo,"2^%d = %f\n", bar, baz);
如果您发现自己这么做了,可能需要将以下内容添加到您的~/.vimrc
:
" Refactor the given lines using a dictionary " replacing all occurences of each key in the dictionary with its value function! Refactor(dict) range execute a:firstline . ',' . a:lastline . 's/\C\<\%(' . join(keys(a:dict),'\|'). '\)\>/\='.string(a:dict).'[submatch(0)]/ge' endfunction command! -range=% -nargs=1 Refactor :, call Refactor( )
这使您可以使用该:Refactor {'frog':'duck', 'duck':'frog'}
命令,并且比手动创建dict的正则表达式重复性稍差.
替换的第二部分是双引号字符串,因此可以进行任何正常插值.这意味着您可以使用捕获的值来索引到哈希:
#!/usr/bin/perl use strict; use warnings; my %replace = ( quick => "slow", lazy => "energetic", ); my $regex = join "|", keys %replace; $regex = qr/$regex/; my $s = "The quick brown fox jumps over the lazy dog"; $s =~ s/($regex)/$replace{$1}/g; print "$s\n";
您可以连接vim替换:
快速的棕色狐狸在懒惰的小溪旁边跑得很快.
:s/quick/slow/|s/lazy/energetic/
慢慢的棕色狐狸在精力充沛的小溪旁边迅速奔跑.
这里的优点是你只需输入一次替换
RGDS
您可以执行以下操作.
:%s/quick\(.*\)lazy/slow\1energetic
诀窍是使用parens匹配两个单词之间的文本.然后,您可以使用替换字符串中的此文本\1
.您还可以使用\2
第二个匹配的paren表达式,依此类推.这允许您替换多个单词而不会干扰其间的文本.