正则表达式中的空搭配

时间:2015-03-26 10:48:09

标签: ruby regex

我使用不区分大小写的\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")匹配?

你可以在http://rubular.com/r/M4a1Jnnyrm

中使用它

3 个答案:

答案 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)