6

我正在使用 vim 进行搜索并使用以下命令替换:

%s/lambda\s*{\([\n\s\S]\)*//gc

我正在尝试匹配{. 例如,这一行的全部内容应匹配:

    lambda {
  FactoryGirl.create ...

相反,它只匹配换行符并且之前没有空格FactoryGirl。我之前尝试过手动替换所有空格,以防万一有制表符代替,但没有骰子。谁能解释为什么这不起作用?

4

2 回答 2

16

\s是空格的原子;\n,虽然看起来很相似,但在语法上是换行符的转义序列。在集合 atom[...]中,您不能包含其他原子,只能包含字符(包括一些特殊的字符,例如\n. From :help /[]

  • 当 'cpoptions' {Vi 无此功能} 中不包含 'l' 标志时,接受以下翻译:
\e  <Esc>
\t  <Tab>
\r  <CR>    (NOT end-of-line!)
\b  <BS>
\n  line break, see above |/[\n]|
\d123   decimal number of character
\o40    octal number of character up to 0377
\x20    hexadecimal number of character up to 0xff
\u20AC  hex. number of multibyte character up to 0xffff
\U1234  hex. number of multibyte character up to 0xffffffff

注意:上面提到的其他反斜杠代码在 [] 中不起作用!

因此,要么按字面意思指定空白字符,要么[ \t\n...]使用相应的字符类表达式[[:space:]...],或者通过逻辑或将原子与集合组合\%(\s\|[...]\)

于 2012-09-05T07:30:00.533 回答
1

Vim 以[ ... ]不同的方式解释字符类中的字符。这不是字面意思,因为该正则表达式不会完全匹配lambda {sssor lambda {\\\。什么\s\S被解释为......我仍然无法解释。

但是,我几乎可以实现我想要的:

%s/lambda\s*{\([\n a-zA-z]\)*//gc

这忽略了我想要的标点符号。这有效,但很危险:

%s/lambda\s*{\([\n a-zA-z]\|.\)*//gc

因为在最后一个字符之后添加一个字符 like}会导致 vim 在 globbing 时挂起。所以我的解决方案是将我需要的标点符号添加到字符类中。

于 2012-09-04T20:55:11.557 回答