【问题标题】:Modify raw input to look like a bus timetable in specific format using regex?使用正则表达式将原始输入修改为特定格式的巴士时间表?
【发布时间】:2020-04-29 10:50:24
【问题描述】:

我已经尝试解决这个问题很长时间了,但似乎找不到可以立即工作或以我喜欢的方式工作的解决方案。

我的输入如下所示:

0430
0500 25 50
0615 34 51
0708 26 43

我需要把它变成这样:

04:30
05:00,05:25,05:50
06:15,06:34,06:51
07:08,07:26,07:43

由于这只是输入的一部分,并且无法手动替换所有内容,我猜最好的选择是使用正则表达式。

需要做什么:

  1. 在前两个密码后插入冒号(类似于(^\d{2}),然后用$1: 进行替换/替换)
  2. 用逗号 + 前两个密码 + 冒号替换每个空格。 我的想法是捕获组(^\d{2}:),然后用,$1(每行)替换所有空格,但我似乎找不到方法。

我使用regex101.com 来做这件事,所以如果你有任何关于如何做或在哪里做的建议(或者即使正则表达式不是做这件事的方法,你会推荐什么其他方式)任何帮助将不胜感激。

提前致谢!

【问题讨论】:

  • 您使用什么语言/工具?来自regex tag info:“由于正则表达式尚未完全标准化,所有带有此标签的问题还应包含一个指定适用的编程语言或工具的标签。”
  • 我的 PC 上有 Notepad++、VS Code,但为了玩游戏,我使用 regex101.com。

标签: regex text replace notepad++ timetable


【解决方案1】:

这是使用 Notepad++ 完成这项工作的一种方法:

  • Ctrl+H
  • 查找内容:^(\d\d)(\d\d)(?:\h+(\d\d)\h+(\d\d))?
  • 替换为:$1$2(?3,$1\:$3,$1\:$4:)
  • 检查 环绕
  • CHECK 正则表达式
  • 全部替换

说明:

^               # beginning of line
  (\d\d)        # group 1, 2 digits
  (\d\d)        # group 2, 2 digits
  (?:           # non capture group
    \h+         # 1 or more horizontal spaces
    (\d\d)      # group 3, 2 digits
    \h+         # 1 or more horizontal spaces
    (\d\d)      # group 4, 2 digits
  )?            # end group, optional

替换:

$1              # content of group 1
$2              # content of group 2
(?3             # if group 3 exists
  ,$1\:$3           # a comma then content of group 1 and 3
  ,$1\:$4           # a comma then content of group 1 and 4
  :             # else nothing
)               # end conditional

屏幕截图(之前):

屏幕截图(之后):

【讨论】:

  • 感谢您的回复!这与我目前的做法非常相似,但令我困扰的是它不适合可变长度。例如,一行可能是 0430,另一行可能是 0530 45 55,另一行可能是 0615 25 30 40 50 55。我认为会有一些递归方式,因为 (h+\d\d) 部分显然是重复的本身,但是当我尝试这样做时,它只捕获最后一个匹配的组,而在两者之间跳过所有。
  • @DinoBrdar:好的,我明白了,给我一点时间;)
  • @DinoBrdar:解决方法:查找 ^(\d\d):?(\d\d)((?:,\d\d:\d\d)*)(?:\h+(\d\d))? 替换 (?1$1\:$2:)$3(?4,$1\:$4:) 并根据需要多次按“全部替换”。
  • 另一种方式:查找^(\d\d):?(\d\d)((?:,\d\d:\d\d)*)(?:\h+(\d\d))?(?:\h+(\d\d))?(?:\h+(\d\d))?(?:\h+(\d\d))?替换(?1$1\:$2:)$3(?4,$1\:$4:)(?5,$1\:$5:)(?6,$1\:$6:)(?7,$1\:$7:)
  • 谢谢,最后一个对我来说是最实用的方法。
猜你喜欢
  • 2012-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-14
  • 1970-01-01
相关资源
最近更新 更多