代码之家  ›  专栏  ›  技术社区  ›  Eric Hu

Vim正则表达式与字符类中的空格不匹配

  •  7
  • Eric Hu  · 技术社区  · 12 年前

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

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

    我正在尝试匹配 { 例如,整行应该匹配:

        lambda {
      FactoryGirl.create ...
    

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

    2 回复  |  直到 12 年前
        1
  •  16
  •   Ingo Karkat    12 年前

    这个 \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\|[...]\)

        2
  •  1
  •   Eric Hu    12 年前

    Vim在 [ ... ] 角色类不同。这不是字面意思,因为正则表达式不完全匹配 lambda {sss lambda {\\\ 什么 \s \S 被解释为…我仍然无法解释。

    然而,我几乎实现了我想要的目标:

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

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

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

    因为在最后一个字符后面添加一个字符就像 } 导致vim在全球化时挂起。所以我的解决方案是在字符类中添加我需要的标点符号。