正则表达式不匹配字符串的一部分

正则表达式不匹配字符串的一部分

我正在以多种格式搜索时间,例如:

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:5am 这样的时间,那么它部分匹配为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\.?)?

相关内容