【问题标题】:How to find and replace before the match?比赛前如何查找和替换?
【发布时间】:2019-10-09 02:34:15
【问题描述】:

我有逗号分隔的数据,例如 12345,6789,567890。我想要的是在第一个逗号之前找到 3 位数字并在它们开始的地方放一个逗号。鉴于上述条目,我想在第一个逗号之前找到 3 位数字,即 345 并将条目“12345”转换为“12,345”。

在第一个逗号出现之前找到 3 位数字的正则表达式是什么,以及如何将逗号放在这 3 位数字之前。我正在使用 vim。

【问题讨论】:

  • 为什么要标记perl
  • (1) 那会改变你的数据——那一行将有六个字段(如果你插入一个逗号而不是句号)。那是你要的吗? (2) 一个数字超过6位怎么办:你是继续往下走,所以插入两个逗号?

标签: regex perl pcre vi regex-lookarounds


【解决方案1】:

为了查找和替换,您需要捕获组。允许您执行此操作的正则表达式是:

(\d{3},)([\d,]*)

但是,为了能够使用它在vim 中查找和替换,您需要进行简单的修改,因为它需要跳过量词的第一个大括号。然后,您可以在整场比赛之前插入昏迷。可以直接在vim中使用如下语句:

.s/\d\{3},[\d,]*/,\0/

作为简要说明,\d\{3}, 允许您完全匹配第一个逗号和逗号之前的前三个数字。然后正则表达式的其余部分允许您捕获尾随部分。最后,在vim 中,,\0 允许您在完整匹配之前设置一个逗号。

【讨论】:

    【解决方案2】:

    你已经用 perl 标记了,所以你可以这样做:

    echo '12345,6789,567890' | perl -pe 's/^[^,]*\K(?=\d{3},)/,/'
    12,345,6789,567890
    

    说明:

    ^               # beginning of line
      [^,]*         # 0 or more any character but comma
      \K            # forget all we have seen until this position
      (?=           # positive lookahead, make sure we have after:
        \d{3}       # 3 digits
        ,           # a comma
      )             # end lookahead
    

    【讨论】:

      猜你喜欢
      • 2016-01-05
      • 1970-01-01
      • 1970-01-01
      • 2020-07-16
      • 1970-01-01
      • 2018-12-31
      • 2013-07-18
      • 2022-07-23
      • 2014-04-14
      相关资源
      最近更新 更多