作为Web服务响应的一部分,我必须提取迄今为止使用以下任一格式的日期字符串:
(我无法控制服务本身;那里有各种各样的非标准日期格式加上[不准确]本地化,所以你必须相信我在上下文中我需要一个正则表达式。)
到目前为止,我一直在使用以下模式来提取我需要的部分:
@"(((\\d{1,2})\\s([a-z]+)\\s(\\d{4}))\\-(\\d+:\\d+))(\\s([a-z]{3}))?$"
然而,又引入了另一种新格式,没有时间:
这似乎是一个简单的修改。我在连字符+时间(“-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}
)失败。
我可以为此提出至少一些笨拙的解决方法,但为了清洁代码,我是......
感谢。
答案 0 :(得分:0)
新正则表达式的含义已经改变:在原始正则表达式中,EST
是可选的;但是,如果发现短划线,它将成为新正则表达式中的强制性。
如果您想在不改变表达式其余部分含义的情况下选择时间部分,请在时间部分周围添加一个可选的非捕获组,如下所示:
@"((\\d{1,2})\\s([a-z]+)\\s(\\d{4}))(?:-(\\d+:\\d+)(?:(\\s([a-z]{3}))?))?$"
我使用非捕获组(?:...)
来保留原始表达式中的组编号。