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

Possible bug in NSRegularExpression (optional atom)…?

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

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

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

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

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

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

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

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

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

我至少可以想出一些笨拙的解决方法,但是为了代码的简洁,我是不是……

  1. 打乱正则表达式? (我不这么认为,我已经在 regex101.com 测试过它并且它有效。)
  2. NSRegularExpression 文档中遗漏了什么?
  3. 遇到 class 中的实际错误(在这种情况下我会继续并向 Apple 报告)?

谢谢。

你的新正则表达式的含义已经改变:在原来的正则表达式中,EST 是可选的;但是,如果破折号被发现,它在新的正则表达式中将成为强制性的。

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

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

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