regex - 在 Vim 中,如何在子表达式中进行替换?

标签 regex vim substitution

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

我知道替代品可以完成这项工作,所以我想到了这个,这显然行不通(这也是我来这里的原因)。

:%s/class="[^"]*"/\='class="'.substitute(submatch(0), '[^o-]*', 'o-'.submatch(1), 'g').'"'/g

解释:

  1. class="[^"] - 匹配 class="foo bar baz"
  2. 的所有实例
  3. \='class="'.substitute(subexp).'"' - 替换找到的实例 class="subexp"
  4. subexp 应将每个空格分隔的类替换为带有前缀 o-
  5. 的原始类名

总而言之,在程序方面,对于每个 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/

相关文章:

java - groovy 或 java : how can replace '\' with '\\' 'C:\www\web-app\StudyReports\test.bat'

Python;通过正则表达式从字符串中解析带有点的版本号

vim - 按文件位置有条件地调用 autocmd

用变量值替换字符串中的变量名 [R]

javascript - 在 CKEditor 中键入时替换文本

regex - 为什么 VSCode 中的 `f(?=\=)` 正则表达式无效?

c# - 在正则表达式中使用 Unicode block

vim - 我可以将键绑定(bind)映射到 vimrc 中的函数吗?

linux - Vim:不支持警告区域

python - 如何逐字使用括号中的变量