我想匹配一个模式,替换部分模式,并使用模式中的变量作为替换字符串的一部分。
这是对的吗?
/s/^((\s+)private\sfunction\s__construct\(\))/(2)def\s__init__
英文:用相同数量的空格和字符串"private function __construct()"
替换任意数量的空格,后跟字符串def __init__
。那么,我的正则表达式是坏还是什么?
答案 0 :(得分:13)
我认为您要在vi
替换所有出现次数
:s/^\(\s\+\)private function __construct()/\1def __init__/g
替换第一个
:s/^\(\s\+\)private function __construct()/\1def __init__/
对您的模式提出的建议很少
/
用于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或任何其他程序中找到内置方法来做到这一点。不过,我确信我可以编写一个脚本来完成它。