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