正则表达式查找除第一个数字之外的字符串

Regex to find string except first number

我有一个包含很多信息的大文件

939112 how is build on floor 3 63044 2022-01-17 13:23:25.891139
939113 how is build on floor 1 63044 2022-01-17 13:23:25.891139
939114 how is build on floor 2 63044 2022-01-17 13:23:25.891139

我想在 vim 上使用正则表达式删除除第一个数字以外的所有其他内容?我该怎么做。 我可以搜索所有数字并删除它们,但我想保留数字并且只在这些数字字符串之后删除。

s/^\d*//g

我期待输出

939112, 939113, 939114

939112
939113
939114

您可以在 vim 中使用此替换:

%s/\v^([0-9]+) .*//

解释:

  • \v: 启动 vary magic mode 避免所有 (, )+
  • 的转义
  • ^: 比赛开始
  • ([0-9]+): 匹配捕获组 #1 中的 1+ 个数字
  • .*:匹配 space 后跟任何东西
  • /:替换为我们在组#1
  • 中捕获的值

如果没有 vary 魔法,它将是:

:%s/^\([0-9]\+\) .*//

让我们看看:s/^\d*//g有什么问题…

  • 只适用于当前行。您需要给它一个 :help :range 才能应用于多行。假设您希望它在缓冲区中的每一行都完成,范围应该是 %:

    :%s/^\d*//g
    
  • 因为你真的想对行中的第一个数字进行操作,所以 /g 修饰符(意思是“行中的所有匹配项”)是无用的,可以删除:

    :%s/^\d*//
    
  • 模式 ^\d* 表示“零个或多个数字,锚定到行的开头”因此该命令将行开头的每个数字替换为空,有效地删除它们......这与你想要的完全相反。您需要的是一种将您想要保留的内容您想要删除的内容分开的方法

    ^\d* 足以满足 你想保留的东西 你要去掉的就是它后面的所有内容,可以表示为.*:

    :%s/^\d*.*//
    

    但这会删除所有内容,您仍然需要分离它们,并且有几种方法可以使用Vim的正则表达式方言来做到这一点。

    最简单的是使用:help \zs:

    :%s/^\d*\zs.*//
    

    使用该方法,您告诉 Vim 匹配 您想要保留的内容 您想要删除的内容 但是仅对 要删除的内容执行替换.