当前位置:  开发笔记 > 编程语言 > 正文

我可以在VIM或Perl中的单个正则表达式中替换多个项目吗?

如何解决《我可以在VIM或Perl中的单个正则表达式中替换多个项目吗?》经验,为你挑选了4个好方法。

假设我有一个字符串"快速的棕色狐狸跳过懒狗"我可以用一个正则表达式将其更改为"慢棕狐跳过精力充沛的狗"吗?目前,我为这种情况使用了两组正则表达式.(在这种情况下,我使用s/quick/slow/后跟s/lazy/energetic/.)



1> rampion..:

您可以使用词典在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,barbaz改变

foobar

barbaz

bazfoo

%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的正则表达式重复性稍差.



2> Chas. Owens..:

替换的第二部分是双引号字符串,因此可以进行任何正常插值.这意味着您可以使用捕获的值来索引到哈希:

#!/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";


它不需要/因为它是一个简单的插值,在提出索赔之前尝试代码.
如果您想要有2个替换字符串,其中一个字符串是另一个字符串的前缀(例如:"dep"=> 1,"depesz"=> 2),则此方法会出现问题.为了避免这个问题,你应该通过减少密钥长度来排序%replace的键.

3> joe_zeroh..:

您可以连接vim替换:

快速的棕色狐狸在懒惰的小溪旁边跑得很快.

:s/quick/slow/|s/lazy/energetic/

慢慢的棕色狐狸在精力充沛的小溪旁边迅速奔跑.

这里的优点是你只需输入一次替换

RGDS



4> JaredPar..:

您可以执行以下操作.

:%s/quick\(.*\)lazy/slow\1energetic

诀窍是使用parens匹配两个单词之间的文本.然后,您可以使用替换字符串中的此文本\1.您还可以使用\2第二个匹配的paren表达式,依此类推.这允许您替换多个单词而不会干扰其间的文本.


如果有多个快速和懒惰的交错出现怎么办?
推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有