Regex NSRegularExpression(可选atom)和#x2026;中可能存在的错误;?

Regex NSRegularExpression(可选atom)和#x2026;中可能存在的错误;?,regex,nsregularexpression,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}))?$" 然而,又引入了另一种新

作为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}
)失败

我至少可以想出一些笨拙的解决办法,但是为了干净的代码,我是不是

  • 弄乱了正则表达式?(我不这么认为,我已经在regex101.com上测试过了,它可以正常工作。)
  • NSRegularExpression文档中缺少某些内容
  • 在课堂上碰到了一个实际的bug(在这种情况下,我会继续向苹果公司报告)

  • 谢谢。

    您的新正则表达式的含义已经改变:在原始正则表达式中,
    EST
    是可选的;但是,如果发现破折号,它在新正则表达式中是强制性的

    如果希望在不更改表达式其余部分含义的情况下使时间部分成为可选的,请在时间部分周围添加可选的非捕获组,如下所示:

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

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

    这很奇怪。确实在传递(不区分大小写),但它无论如何都不是同一个正则表达式引擎。这只是猜测,因为我无法使用NSRegularExpression对其进行测试,也无法在其上找到任何文档。但有一件事您可以尝试一下,
    @(?:(\\d{1,2})\\s([a-z]+)\\s(\\d{4}))(((?:\-\\d+:\\d+\\d+)((?:\\s[a-z]{3})$”
    ,除了有一个有限的表达式(尽管有一些可能是空的)之外,几乎是相同的表达式捕获组的数量。其想法是,NSRegularExpression不喜欢它不知道结果中将包含的组的数量。这并不理想,因为您捕获的数量超过了您想要的数量,但您可以测试情况是否如此。没错,Lucas。我忘了在我的代码和regex101.@rvalvik:我觉得这是个答案;你为什么不把它贴出来呢?评论是用来提出快速的问题或建议的,通常是关于问题本身的。对不起,各位……就像很多神秘的行为一样,这一个与似乎是罪魁祸首的代码行无关。第二个input字符串确实在工作,但在代码尝试访问substringWithRange时引发了一个错误:使用一个“空”范围(其location属性似乎设置为LONG_MAX)。正在处理该错误(/忽略)dasblinkenlight:这对你有用吗?我试着把它插入到我的代码中,同样的错误似乎被暴露了。如果我将最后一个“?”改为“+”,那么它将匹配上面的第一个输入(当然,其他两个都不匹配)然而,事实上,它们都不匹配。不管怎样,我永远感谢被介绍给非捕获组。我不敢相信我在不知道这些是什么的情况下写了这么长时间的正则表达式。谈谈干净的输出!!@RiqueW我需要到我的Mac上试试。我会让你知道发生了什么。dasblink不要麻烦了。请看我上面的评论。不过我接受你的回答,因为A)这是对我模式的改进;B) 你无意中提出的关于非捕获组的提示确实提高了周围代码的易读性(质量,甚至?);C) 让我印象深刻的是,您能够在不使用计算机的情况下编辑该模式!!再次感谢。