4

我正在尝试使用 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 吗?

4

1 回答 1

5

它实际上匹配 23:10:7and 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]在字符串的末尾,如果匹配的数字是该行的最后一位,也就是说,如果它后面跟着$.

另一种选择是,如果最后一个数字小于 10,则强制用 0 填充,即,而不是[0-9]use 0[0-9]。这将匹配23:10:07,但不是23:10:7。这与你已经拥有的小时部分相同。

于 2012-09-15T14:16:13.150 回答