我有一个包含如下字符串的文件:
print $hash_xml->{'div'}{'div'}{'div'}[1]...
我想用其他东西替换{'div'}{'div'}{'div'}[1]
。
所以我试过
%s/{'div'}{'div'}{'div'}[1]/by something else/gc
找不到字符串。我虽然不得不逃避{
,}
,[
和]
仍找不到字符串。
所以我尝试搜索单个{
并找到它们。
然后我尝试搜索{'div'}{'div'}{'div'}
并再次找到它
然后仍然找到{'div'}{'div'}{'div'}[1
。
查找{'div'}{'div'}{'div'}[1]
我必须使用%s/{'div'}{'div'}{'div'}[1\]
为什么?
Linux上的vim 7.3
答案 0 :(得分:7)
在正则表达式中使用[]来包装一系列可接受的字符。
当两者都未转义时,vim会将搜索字符串视为正则表达式。
所以当你把它遗漏掉,或者逃避最后一个字符时,vim不能解释正则表达式上下文中的单个括号,文字搜索也是如此(基本上它是搜索字符串最好的。)
就个人而言,我会逃避打开和关闭方括号以确保其含义清晰。
答案 1 :(得分:5)
这是因为[
和]
字符用于构建搜索模式。
请参阅:h pattern
并使用帮助文件pattern.txt
尝试以下实验:
使用/[0-9]
搜索“[9-0]”模式(不带引号)将分别匹配0到9之间的每个数字(请参阅:h \[
)
现在,如果您尝试/\[0-9]
或/[0-9\]
,您将匹配整个模式:零,连字符和方括号内的九个。那是因为当你逃离[
或]
中的一个时,运营商[*]
不再存在。
使用您的搜索模式,/{'div'}{'div'}{'div'}[1\]
和/{'div'}{'div'}{'div'}\[1]
应该匹配您想要的相同模式,而/{'div'}{'div'}{'div'}[1]
匹配字符串{'div'}{'div'}{'div'}1
。
答案 2 :(得分:2)
为了避免被正则表达式中的这些特殊字符捕获,您可以尝试使用very magic
标记。
E.g:
:%s/\V{'div'}[1]/replacement/
注意行开头的\V
标志。
答案 3 :(得分:1)
因为方括号意味着vim认为你正在寻找里面的任何角色。这被称为“角色类”。通过转义任何一个方括号,它让vim知道你正在寻找以'[1]'结尾的文字方形字符串。
理想情况下,您应该将表达式编写为:
%s/{'div'}{'div'}{'div'}\[1\]/replacement string/
确保意义完全清楚。