【问题标题】:regex to capture the second space in a line?正则表达式捕获一行中的第二个空格?
【发布时间】:2014-11-06 19:56:48
【问题描述】:

我收到以下文字:

靠近、靠近、依次或沿指定路线/ 方向

如何匹配关闭中“e”后的空格,然后用制表符替换它?

虽然这对你们所有人来说可能都很容易,但我已经花了 4 个小时尝试做到这一点,但没有成功。

一般规则是“仅匹配第二个单词之后的空格”。我有超过 2000 条独特的行,这就是我需要正则表达式的原因。

谢谢!!

【问题讨论】:

  • 使用这个特定的文本很容易做到这一点..您需要遵循更一般的规则吗?什么语言/正则表达式引擎?
  • 是的,我需要帮助的一般规则是“始终只匹配一行中的第二个空格。不多不少。”我必须这样做 2000 次,然后用制表符替换匹配的空间
  • 为什么要使用正则表达式?为什么不直接使用字符串函数?
  • 我在使用 vim 的常规文本文件中。您必须使用正则表达式来识别一行中的第二个空格。不是吗?

标签: regex vim


【解决方案1】:

搜索:^([^ ]+[ ]+[^ ]+)[ ]
替换为:\1\t

从该行的开头,寻找一个非空格的模式,然后是空格,然后是另一组非空格。最后,匹配一个空格字符。
替换是最后一个空格字符之前的所有内容,后跟一个制表符。

演示:http://regex101.com/r/oS8vV7/1


您可能无法匹配您要替换的空间。这将需要查看可变长度 isn't supported

【讨论】:

    【解决方案2】:

    vi 编辑器中,您可以使用此搜索/替换:

    :s/^\([[:blank:]]*\w\+[[:blank:]]\+\w\+\)[[:blank:]]\+/\1\t/
    

    或者更短(感谢@PeterRincker):

    :%s/\v(\w+\zs\s+){2}/\t
    

    【讨论】:

    • 更短一点::%s/\v(\w+\zs\s+){2}/\t 更短一点::%norm 2f r^I 其中^I 是通过<c-v><tab> 键入的制表符。
    【解决方案3】:
    s/\s//2
    

    这可用于搜索空格 (\s) 和删除空格,其中2 代表第二个空格。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-03
      • 2022-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多