【问题标题】:grep multiple numeric searchgrep 多个数字搜索
【发布时间】:2014-08-08 01:45:03
【问题描述】:

我正在尝试进行 grep 搜索以匹配时间。例如我想匹配以下短语:

12 45 am in CA
It is currently 3 45 am
16 45 pm is the current time
3 23pm in a few hours
10 00 is the best time

我尝试使用:

grep '[0-12] [0-5][[0-9]]( ){0,1}(am|pm){0,1}' 

现在我的输出没有意义。如果是的话,我应该逃避一些角色吗?为什么?

【问题讨论】:

  • 10 00 也是按时间匹配的吗?
  • @user3218114 你能举一个期望输出的例子吗?对我来说,不清楚您是要获取完整的短语还是仅获取数字。
  • 10 is the best time 匹配吗?

标签: regex grep


【解决方案1】:

[0-12] 是一个Character Classes or Character Sets,它告诉正则表达式引擎只匹配几个字符中的一个。

这里0-1将代表0到1的范围。所以最后它只会匹配0,1和2。


12 小时格式正则表达式模式中的时间:

(0?[0-9]|1[0-2]) [0-5]?[0-9] ?([ap]m)?

说明:

  (                        group and capture to \1:
    0?                       '0' (optional)
    [0-9]                    any character of: '0' to '9'
   |                        OR
    1                        '1'
    [0-2]                    any character of: '0' to '2'
  )                        end of \1
                           ' '
  [0-5]                    any character of: '0' to '5' (optional)
  [0-9]                    any character of: '0' to '9'
                           ' ' (optional)
  (                        group and capture to \2 (optional):
    [ap]                     any character of: 'a', 'p'
    m                        'm'
  )?                       end of \2

这里也是DEMO


关于你的正则表达式模式的几点:

( ){0,1} 可以转换为[ ]? 或简单地single space followed by ? 其中? 匹配它零和一次

(am|pm)可以转换成[ap]m

[[0-9]]不用双括号

【讨论】:

  • 谢谢!该命令是否适用于 egrep 而不是 grep?有没有办法在没有任何额外选项的情况下使用 grep 进行这项工作?
  • 对不起,我只知道一点正则表达式模式。不知道grep 命令。
  • nvm 想通了!谢谢!
【解决方案2】:

试试这个:

12 小时制:

\b([0]{0,1}[0-9]|1[01]) [0-5][0-9]{0,1}\s{0,1}(am|pm){0,1}

输出:

  • 凌晨 3 点 45 分
  • 下午 3 点 23 分
  • 10 00

24 小时制:

 \b([01]{0,1}[0-9]|2[0-3]) [0-5][0-9]{0,1}\s{0,1}(am|pm){0,1}

输出:

  • 12 点 45 分
  • 凌晨 3 点 45 分
  • 16 点 45 分
  • 下午 3 点 23 分
  • 10 00

【讨论】:

  • 不知何故这对我不起作用。 ([01]{0,1}[0-9]|2[0-3]) 匹配什么。尤其是 2[0-3] 的部分。这个匹配到底是什么?
  • @user3218114 是的!它是 24 小时格式。你能显示“不知何故这对我不起作用。”? user0750474
  • @Tim.Tang OP 根据示例和正则表达式模式需要 12 小时格式。
  • 谢谢!这个命令是否适用于 egrep 而不是 grep?有没有办法在没有任何额外选项的情况下使用 grep 进行这项工作?
【解决方案3】:

这个怎么样?

grep '[0-9]\{1\} [0-9]\{2\}' time.test

例如,使用以下测试文件:

$ cat time.test
12 45 am in CA
It is currently 3 45 am
16 45 pm is the current time
3 23pm in a few hours
10 00 is the best time
3 is just a number
also my favorite number is 13
how about the current year 2014

输出是:

$ grep '[0-9]\{1\} [0-9]\{2\}' time.test
12 45 am in CA
It is currently 3 45 am
16 45 pm is the current time
3 23pm in a few hours
10 00 is the best time

由于 am 和 pm 不一致(可能出现也可能不出现),因此可以将问题减少到仅grep两个数字之间有一个空格。

希望这会有所帮助。

【讨论】:

  • 呃。无需指定 \{1\} 重复任何内容。
猜你喜欢
  • 2010-11-24
  • 2019-03-08
  • 1970-01-01
  • 2019-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-04
  • 2014-05-04
相关资源
最近更新 更多