我想在所有类名前加上 o-
,而不必手动调整每个类名。我使用 Vim。
我知道替代品可以完成这项工作,所以我想到了这个,这显然行不通(这也是我来这里的原因)。
:%s/class="[^"]*"/\='class="'.substitute(submatch(0), '[^o-]*', 'o-'.submatch(1), 'g').'"'/g
解释:
class="[^"]
- 匹配class="foo bar baz"
的所有实例
\='class="'.substitute(subexp).'"'
- 替换找到的实例class="subexp"
subexp
应将每个空格分隔的类替换为带有前缀o-
的原始类名
总而言之,在程序方面,对于每个 class="foo bar baz"
,将每个 className 替换为带有 o-
前缀的 className。
提前致谢。
(奖励)编辑:当遇到已经以 o-
开头的类名时,如何编写它来忽略或处理类名,以便 o-o-
不是结果编辑。
最佳答案
举个例子
class="foo bar baz"
这一行有效:
%s/class="\zs[^"]*\ze"/\=join( map(split(submatch(0)),"'o-'.v:val"), ' ')/
所以有嵌套的函数调用:
- 我没有使用
\<
边界,因为如果你的类名中有一些“特殊”字符,它将失败。例如。# - or @
.我不知道你的语言是不是这样。 - submatch(0) 是
"foo bar baz"
-
split()
使它(每个类)进入列表 -
map()
添加o-
每个类名 -
join()
将修改后的列表变回字符串
所以在执行这个命令之后,你应该看到:
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
如果元素以o-
开头那么我们不添加另一个 o-
没有了。
关于regex - 在 Vim 中,如何在子表达式中进行替换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34192250/