Vim替换中的反向引用通配符匹配

qij5mzcb  于 2022-11-11  发布在  其他
关注(0)|答案(1)|浏览(255)

我有一个三行的文件。

HelloStackOverflow
ThisIsMyFirstPost
OnThisWebsite

我希望它看起来像这样。

HELLO_STACK_OVERFLOW
THIS_IS_MY_FIRST_POST
ON_THIS_WEBSITE

有没有办法用Vim的替代品来做这个?我现在有这个。

:%s/^\([A-Z][a-z]*\)*\([A-Z][a-z]*\)$/\U\1_\2/g

第一组捕获每行中最后一个单词之前的所有单词,第二组捕获最后一个单词。我可以将反向引用“扩展”到第一组中的多个匹配项,以便将_放在每个匹配项之后吗?目前,它产生了以下结果。

STACK_OVERFLOW
FIRST_POST
THIS_WEBSITE

\1给出最后一个通配符匹配)

qkf9rpyu

qkf9rpyu1#

由于在第一个捕获组之后有一个*,因此实际上只有最后一个重复才会出现在第一个捕获组中。此外,这种重复将使您无法在短语的前面插入下划线。
我会将其设置为?而不是*。其思想是,您只希望捕获短语中第一个单词时的内容(一个单词),但对于输入中的任何其他位置,您不希望在此处匹配任何内容。
因此,需要进行一些更改:

  • 将第一个捕获组之后的*更改为?
  • ^应在捕获组内移动,因此?适用于它。
  • 末尾的$应该被删除,否则同一行上不能有多个匹配。

这给出:

:%s/\(^[A-Z][a-z]*\)?\([A-Z][a-z]*\)/\U\1_\2/g

相关问题