Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在Vim中,如何在子表达式中替换?_Regex_Vim_Substitution - Fatal编程技术网

Regex 在Vim中,如何在子表达式中替换?

Regex 在Vim中,如何在子表达式中替换?,regex,vim,substitution,Regex,Vim,Substitution,我想用o-在所有类名前加上前缀,而不必手动调整每个类名。我使用Vim 我知道替补可以胜任这项工作,所以我想到了这个,这显然不起作用(这也是我来这里的原因) 说明: class=“[^”]-匹配class=“foo bar baz” \='class=“”.subexp(subexp)。“-替换找到的实例class=“subexp” subexp应将每个空格分隔的类重新划分为两个类,并在原始类名前面加上o- 总之,在程序方面,对于每个class=“foo bar baz”,将每个类名替换为前面加有

我想用
o-
在所有类名前加上前缀,而不必手动调整每个类名。我使用Vim

我知道替补可以胜任这项工作,所以我想到了这个,这显然不起作用(这也是我来这里的原因)

说明:

  • class=“[^”]
    -匹配
    class=“foo bar baz”
  • \='class=“”.subexp(subexp)。“
    -替换找到的实例
    class=“subexp”
  • subexp
    应将每个空格分隔的类重新划分为两个类,并在原始类名前面加上
    o-
  • 总之,在程序方面,对于每个
    class=“foo bar baz”
    ,将每个类名替换为前面加有
    o-
    的类名

    提前谢谢


    (奖金)编辑:当遇到以
    o-
    开头的类名时,如何编写此命令来忽略或处理这些类名,以便
    o-o-
    不是结果编辑。

    一种方法是利用
    \zs…\ze
    ,以及
    子匹配(0)这一事实
    解析为
    \zs…\ze
    之间匹配的字符串:

    :%s/\mclass="\zs.\{-}\ze"/\=substitute(submatch(0), '\<', 'o-', 'g')/g
    
    :%s/\mclass=“\zs.\{-}\ze”/\=submatch(0),”\作为示例

    class="foo bar baz"
    
    这条线路的工作原理是:

    %s/class="\zs[^"]*\ze"/\=join( map(split(submatch(0)),"'o-'.v:val"), ' ')/
    
    因此存在嵌套函数调用:


    • 我没有使用
      \n我认为第二个示例永远不值得使用,因为它与第一个示例相同,有更多的字符。@FDinoff事实上
      子匹配(0)
      扩展到
      \zs之间匹配的字符串…\ze
      是未记录的。这是有道理的,但可以说这不是大多数人所期望的。它已经有一段时间没有改变了,但Bram最终可能会将其视为一个bug并修复它。:@SatoKatsura-你能对我的(奖金)发表评论吗编辑?@SatoKatsura可能不明确,但submatch(0)返回匹配的文本
      \zs
      设置匹配的开始和
      \ze
      设置匹配的结束。因此,我对它的阅读使它看起来像
      \zs
      \ze
      之间的部分将出现在
      子匹配(0)
      中。你认为人们会期望什么?@FDinoff这是错误的,
      \zs
      \ze
      对匹配的内容没有影响,它们只对被替换的内容产生影响(这就是为什么它们比lookaheads和lookbehinds更有用)。因此,无论
      \zs
      \ze
      如何,子匹配(0)
      的概念上一致的行为都是返回匹配的整个字符串。但我同意当前行为在实践中更有用。您可以从
      join()
      中删除最后一个
      ,默认情况下分隔符是一个空格。@SatoKatsura您是对的,我在一开始就写了
      ,然后发现它应该是空格,只需删除逗号即可:)@Kent-在这些情况下使用的允许函数调用的方便参考在哪里?我可以使用
      man
      命令或任何在线资源。@toszter在vim do
      :h functionname(
      你会看到的。@Kent-你能对我的(奖金)编辑发表评论吗?
      class="foo bar baz"
      
      %s/class="\zs[^"]*\ze"/\=join( map(split(submatch(0)),"'o-'.v:val"), ' ')/
      
      class="o-foo o-bar o-baz"
      
      %s/class="\zs[^"]*/\=join(map(split(submatch(0)),"(v:val=~'^o-'?'':'o-').v:val"))/
      
      (v:val=~'^o-'?'':'o-').v:val