我使用不区分大小写的\i
(([a-z]+(\s*-\s*[a-z]+)?)\:)\s*(\d{1,2}:\d{1,2}\s*[ap]m\s*-\s*\d{1,2}:\d{1,2}\s*[ap]m)
这种输入
Mon - Fri: 10:00 am - 8:00 pm
Sat: 10:00 am - 7:00 pm
Sun: 12:00 am - 5:00 pm
但是我得到了这些比赛
Match 1
1. Mon - Fri:
2. Mon - Fri
3. - Fri
4. 10:00 am - 8:00 pm
Match 2
1. Sat:
2. Sat
3.
4. 10:00 am - 7:00 pm
Match 3
1. Sun:
2. Sun
3.
4. 12:00 am - 5:00 pm
为什么我得到第3名(空和" -Fri")匹配?
中使用它答案 0 :(得分:2)
因为在此Mon - Fri: 10:00 am - 8:00 pm
输入中,您的可选第三个捕获组(\s*-\s*[a-z]+)?
与- Fri
部分匹配。对于其他Sat: 10:00 am - 7:00 pm
,没有像第一个字符串中那样捕获字符串的第二部分(连字符部分)。所以第三组为字符串2和3返回一个空匹配。
答案 1 :(得分:2)
为了不看到这一点,只需让非捕获((?:\s*\-\s*[A-Za-z]+)?
)组:
(([A-Za-z]+(?:\s*\-\s*[A-Za-z]+)?)\:)\s*(\d{1,2}:\d{1,2}\s*[ap]m\s*-\s*\d{1,2}:\d{1,2}\s*[ap]m)
我甚至说第二组也可能是非捕获的:
((?:[a-z]+(?:\s*-\s*[a-z]+)?)\:)\s*(\d{1,2}:\d{1,2}\s*[ap]m\s*-\s*\d{1,2}:\d{1,2}\s*[ap]m)
现在,it is much cleaner,只有2个小组。
答案 2 :(得分:0)
第3场比赛由小组(\s*-\s*[a-z]+)
您可以使用非捕获组来省略第3个匹配组,例如
(([a-z]+(?:\s*-\s*[a-z]+)?)\:)\s*(\d{1,2}:\d{1,2}\s*[ap]m\s*-\s*\d{1,2}:\d{1,2}\s*[ap]m)