1

有没有一种简单的方法可以搜索与图案匹配的所有线条,提取线条上的数字并修改它?

我正在玩一个游戏配置文件,想把所有XP数字加倍,以消除一半的无聊研磨。这些行看起来像这样(例如屏幕截图中的第64行)。

经验要点:###

我只想把这些行上的数字加倍。

我尝试执行以下操作来匹配正则表达式并创建匹配组,但遗憾的是,它说“找不到模式”,但看起来应该匹配吗?

:s/经验点:(\d+)/\=次级比赛(1)*2/g

谢谢!

截图

4个答案4

重置为默认值

%s/\(经验值:\)\@<=\(\d\+\)/\=submatch(2)*2/g

\(...\)@<=是锚定点

\+而不是+用于匹配多个匹配项

1
  • 1
    \z秒可能会更容易,因为它不需要太多分组 5月11日17:49

正则表达式?讨厌!

以下是非正则表达式版本:

从任何带有数字的行开始键入:

q个q个全选剪下c(c)w个Ctrl-R键=Ctrl-R键-*2输入Esc公司q个u个

然后运行命令:

:g/经验点:/norm@q个

它是如何工作的

  • q个q个:开始将宏录制到寄存器“”q“,

  • 全选:移动到行上的下一个数字并递增,

  • 剪下:再次将其减小,返回其原始值。我们只使用全选作为移动到数字的快捷方式,

  • c(c)w个:更改光标下的单词。即数字,

  • Ctrl-R键=:输入表达式寄存器。这允许您执行计算并将其结果输入缓冲区,

  • Ctrl-R键-:输入小删除寄存器的内容,即您正在更改的数字,

  • *2:乘以2。如果你在电话号码上8,现在命令行有了内容8*2,

  • 输入:执行计算。如果你的光标在数字上8,这将进入16进入缓冲区,

  • Esc公司:离开插入模式,

  • q个:停止录制,

  • u个:撤消您刚才所做的更改,将缓冲区恢复到其原始状态!

现在寄存器中有一个宏“”q“这将使光标后的第一个数字在每次运行时加倍。我们可以使用:克在包含文本的每一行上运行此宏的全局命令经验要点:

1
  • 1
    超级酷!这当然比摆弄正则表达式容易。 5月13日2:22
2

我会这样做:

:%s/经验点:\zs(\d\+)/\=子匹配(1)*2/g

如前所述,找不到模式是因为+需要在Vim逃走

为了确保您不会丢失经验要点:我们添加了\z秒之后开始更换。

2

哇,已经有三个答案了,但没有提到:克

包含文本模式的所有匹配行上的双精度数字

只是以下情况的特例:

执行<命令>在所有行上匹配<图案>

哪个是这个的作业:help:全局:

:g/<模式>/<命令>

在这种情况下:

  • <图案>将是经验点(如果需要,将进行改进),
  • <命令>将是s/\d\+/\=子匹配(0)*2,

它给出了:

:g/经验点/s/\d\+/\=子匹配(0)*2
0

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策

不是你想要的答案吗?浏览已标记的其他问题问你自己的问题