将24小时格式化的时间与正则表达式匹配

Ste*_*305 4 regex

我试图使用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
Run Code Online (Sandbox Code Playgroud)

这是我的正则表达式:

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
Run Code Online (Sandbox Code Playgroud)

结果匹配:

23:10:70
23:10:61
22:17:16
01:17:15
00:17:17
Run Code Online (Sandbox Code Playgroud)

知道它为什么匹配23:10:70和23:10:61?

Joã*_*lva 5

它实际上是匹配 23:10:723: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
Run Code Online (Sandbox Code Playgroud)

换句话说,你应该只允许[0-9]在字符串的结尾,如果匹配的数字就行了最后一个,那就是,如果后面$.

另一种选择,是迫使最后一位数字为0填充如果低于10,即,代替[0-9]使用0[0-9].这将匹配23:10:07,但不匹配23:10:7.这与你已经拥有的小时部分相同.