为什么我要逃离决赛]

时间:2011-05-19 12:58:53

标签: vim

我有一个包含如下字符串的文件:

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

4 个答案:

答案 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/

确保意义完全清楚。