我正在尝试使用egrep将24小时时间与正则表达式匹配。
这是我的测试文件test.txt:
32:23:31
24:30:31
23:70:31
23:61:31
23:10:70
23:10:61
22:17:16
01:17:15
24:15:22
0:17:16
00:17:17
24:30:31
这是我的正则表达式:
egrep '(2[0-3]|1[0-9]|0[0-9]|[^0-9][0-9]):([0-5][0-9]|[0-9]):([0-5][0-9]|[0-9])' test.txt
结果匹配:
23:10:70
23:10:61
22:17:16
01:17:15
00:17:17
知道它为什么匹配23:10:70和23:10:61?
答案 0 :(得分:5)
它实际上是匹配 23:10:7
和23:10:6
,但由于您未使用行元字符$
,字符串的结尾,它将处理随后的任何。
egrep '^(2[0-3]|1[0-9]|0[0-9]|[^0-9][0-9]):([0-5][0-9]|[0-9]):([0-5][0-9]|[0-9])$' test.txt
换句话说,如果匹配的数字是该行的最后一位,也就是说,如果后跟[0-9]
,则应该只允许字符串末尾的$
。 / p>
另一种选择是,如果最后一个数字小于10,则强制使用0填充,即代替[0-9]
使用0[0-9]
。这将匹配23:10:07
,但不匹配23:10:7
。这与你已经拥有的小时部分相同。