NSRegularExpression中的可能错误(可选原子)......?

时间:2015-03-06 16:30:23

标签: regex nsregularexpression

作为Web服务响应的一部分,我必须提取迄今为止使用以下任一格式的日期字符串:

  • 2015年3月6日至10日:美国东部时间24日
  • 2015年3月6日至10日:24

(我无法控制服务本身;那里有各种各样的非标准日期格式加上[不准确]本地化,所以你必须相信我在上下文中我需要一个正则表达式。)

到目前为止,我一直在使用以下模式来提取我需要的部分:

@"(((\\d{1,2})\\s([a-z]+)\\s(\\d{4}))\\-(\\d+:\\d+))(\\s([a-z]{3}))?$"

然而,又引入了另一种新格式,没有时间:

  • 2015年3月6日

这似乎是一个简单的修改。我在连字符+时间(“-10:24”)原子周围创建了一个新组,并添加了“零或一个”量词(“?”)来得到这个:

@"(((\\d{1,2})\\s([a-z]+)\\s(\\d{4}))(\\-(\\d+:\\d+))?)(\\s([a-z]{3}))?$"

但是现在所有上述输入字符串的表达式都失败了。

有趣的是,我试过更换“?”与其他量词,并发现任何量词,表明至少一个的那些原子应该存在(例如,(\\-(\\d+:\\d+))+(\\-(\\d+:\\d+)){1,2}),而那些甚至暗示可能它可能不存在(例如,(\\-(\\d+:\\d+))*(\\-(\\d+:\\d+)){0,1})失败。

我可以为此提出至少一些笨拙的解决方法,但为了清洁代码,我是......

  1. 搞乱正则表达式? (我不这么认为,我已经在regex101.com上测试了它并且它有效。)
  2. 在NSRegularExpression文档中缺少某些内容?
  3. 撞到课堂上的实际错误(在这种情况下,我会继续向Apple报告)?
  4. 感谢。

1 个答案:

答案 0 :(得分:0)

新正则表达式的含义已经改变:在原始正则表达式中,EST是可选的;但是,如果发现短划线,它将成为新正则表达式中的强制性。

如果您想在不改变表达式其余部分含义的情况下选择时间部分,请在时间部分周围添加一个可选的非捕获组,如下所示:

@"((\\d{1,2})\\s([a-z]+)\\s(\\d{4}))(?:-(\\d+:\\d+)(?:(\\s([a-z]{3}))?))?$"

我使用非捕获组(?:...)来保留原始表达式中的组编号。