我正在以多种格式搜索时间,例如:
1:00 pm
1 pm
10:38 am
8am
9p.m.
etc...
我想出了以下正则表达式:
([0-9][0-9]?)(\\:([0-9][0-9])(\\:([0-9][0-9]))?)? ?([ap]\\.?m\\.?)
例如,如果有像10:5
am 这样的时间,那么它部分匹配为5 am
10:5 am
如果整个时间与上述正则表达式模式不匹配,我根本不想匹配。
有没有什么办法可以不5 am
部分匹配10:5 am
?
答案1
=match
使用操作员进行测试电源外壳,这似乎可以解决问题:
'(?<=^|\s)(?:\d{1,2}(?:\:\d{2}){0,2})\s?[ap]\.?m\.?'
$times = '1:00 pm,1 pm,10:38 am,8am,9p.m.,10:5 am,7:59 pm'.split(',')
$times | ForEach{
If ($_ -match '(?<=^|\s)(?:\d{1,2}(?:\:\d{2}){0,2})\s?[ap]\.?m\.?') {
$matches
} Else {echo ($_ + ' does not match')}
}
Name Value
---- -----
0 1:00 pm
0 1 pm
0 10:38 am
0 8am
0 9p.m.
10:5 am does not match
0 7:59 pm
(?<=^|\s)
<- 正向后视(必须是行首或以空格开头)
(?:\d{1,2}(?:\:\d{2}){0,2})
<- 一位或两位数的小时 + 可选的分钟和秒。(嵌套的非捕获组)
\s?
<- 可选空间。
[ap]\.?m\.?
<- am|pm|am|pm 可以分组并设为可选项(24 小时制):(?:[ap]\.?m\.?)?