我正在使用vim进行搜索并替换为此命令:
%s/lambda\s*{\([\n\s\S]\)*//gc
我正在尝试匹配{
之后的所有单词,结束行和空格字符。例如,此行的全部内容应匹配:
lambda {
FactoryGirl.create ...
相反,它只匹配换行符,而FactoryGirl
之前没有空格。我之前尝试过手动替换所有空格,以防万一有替代字符,但没有骰子。任何人都可以解释为什么这不起作用?
答案 0 :(得分:15)
\s
是空白的原子; \n
虽然看起来很相似,但语法上是换行符的转义序列。在集合原子[...]
内,你不能包含其他原子,只能包含一些特殊字符(包括\n
等特殊字符。来自:help /[]
:
- 以下翻译在' l'国旗不是 包含在' cpoptions' {Vi无此功能}:
\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\|[...]\)
将原子与集合结合起来。
答案 1 :(得分:1)
Vim以不同的方式解释[ ... ]
个字符内的字符。这不是字面上的,因为正则表达式不会完全匹配lambda {sss
或lambda {\\\
。 \s
和\S
被解释为......我仍然无法解释。
但是,我能够达到我想要的效果:
%s/lambda\s*{\([\n a-zA-z]\)*//gc
忽略了我想要的标点符号。这有效,但很危险:
%s/lambda\s*{\([\n a-zA-z]\|.\)*//gc
因为在}
之类的最后一个字符之后添加字符会导致vim在循环播放时挂起。所以我的解决方案是在字符类中添加我需要的标点符号。