正则表达式:如何替换模式的一部分并引用其中的变量?

时间:2012-01-18 01:31:11

标签: regex vi replace

我想匹配一个模式,替换部分模式,并使用模式中的变量作为替换字符串的一部分。

这是对的吗?

/s/^((\s+)private\sfunction\s__construct\(\))/(2)def\s__init__

英文:用相同数量的空格和字符串"private function __construct()"替换任意数量的空格,后跟字符串def __init__。那么,我的正则表达式是坏还是什么?

partial replace

3 个答案:

答案 0 :(得分:13)

我认为您要在vi

中替换它

替换所有出现次数

:s/^\(\s\+\)private function __construct()/\1def __init__/g

替换第一个

:s/^\(\s\+\)private function __construct()/\1def __init__/

对您的模式提出的建议很少

    {li> /用于vi进行搜索,使用:
  • 您需要在vi
  • 中逃避( )
  • 使用\i我是第x个捕获组,如\1 \2,以便在替换时引用分组模式
  • \s不能用于替换文字使用' '而是
  • 如果要替换所有出现次数,请使用尾随/g

http://vimregex.com应该可以帮助您入门。

答案 1 :(得分:6)

这称为反向引用,您使用\i从模式中引用第i个捕获的组。

因此对于模式^((\s+)private\sfunction\s__construct\(\)),替换为\2def __init__

答案 2 :(得分:3)

我认为没有人真正理解这个问题。基本上,我这样做的方式如下:

“如果你想搜索替换模式,模式a,并用替换字符串替换它,模式i,只有当它以模式开始时,模式b,那么你需要在替换字符串中包含模式b ,像这样:: /(模式b)(模式a)/(模式b)(i)/ g“。

这有点罗嗦,但值得一读。

在过去,我确信有人曾经想过,“它可以节省大量资源,而不是用pattern b实际取代pattern b。这样做是多余的。”也许它会自动发生。我没有在vi或任何其他程序中找到内置方法来做到这一点。不过,我确信我可以编写一个脚本来完成它。