LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1982|回复: 8

日期能否由正则式表示?

[复制链接]
发表于 2005-8-23 10:22:03 | 显示全部楼层 |阅读模式
背景话题:
http://bbs.linuxsir.cn/showthread.php?p=1243830#post1243830
---------------------------
我们称"2004-02-29“是一个合法的日期串,表示2004年2月29日,而"2005-02-30"是非法的;
工作中我们希望把非法的日期串屏蔽掉,那么能否通过正则式来实现日期串的过滤?

我原本考虑说 02-29是不是一个上下文相关的问题(闰年、平年),而正则文法的表述能力远远不如上下文相关文法,所以觉得应该不能实现题给要求。

后来又考虑到,日期的变更有规律吧,给出一个大周期:400年。那么以每年一个状态,画出一个有限自动机应该可行,那么根据有限自动机和正则语言的等价性,理论上是可以用正则式来表示日期的,尽管可能很冗长。

学识有限,希望高手指点迷津一下~ :thank
发表于 2005-8-23 11:16:05 | 显示全部楼层
2005-02-29也是一个非法的日期
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-23 11:23:48 | 显示全部楼层
无语,我想的是2004-02-29,写的是05。。。更正了
回复 支持 反对

使用道具 举报

发表于 2005-8-23 13:17:16 | 显示全部楼层
偶们 rick.xu 说的有道理啊,既然一年内日期是有穷的,那么简单的罗列出所有表示就是你要的正则表达式了
加上年份之后,如果只坚持 400 年又润的算法,那么年份的尾数三位和月日的组合也是有穷的,因此也可以罗列

正则文法里面没办法计算,能在正则表达式里判断大小吗?
回复 支持 反对

使用道具 举报

发表于 2005-8-23 14:32:31 | 显示全部楼层
年份需要列出四位,分两种情况,一种是 100 的倍数,一种不是 100 的倍数
( (_ 1_)00 )  |  ( (_2 _)  (_3 _) )

1 和 3 处是 01-99 之间的所有 4 的倍数
2 处任意

这样得到的就是所有闰年
回复 支持 反对

使用道具 举报

发表于 2005-8-23 17:40:38 | 显示全部楼层
Post by bbbush
偶们 rick.xu 说的有道理啊,既然一年内日期是有穷的,那么简单的罗列出所有表示就是你要的正则表达式了
加上年份之后,如果只坚持 400 年又润的算法,那么年份的尾数三位和月日的组合也是有穷的,因此也可以罗列

正则文法里面没办法计算,能在正则表达式里判断大小吗?


判断大小明显是语义吧
回复 支持 反对

使用道具 举报

发表于 2005-8-23 18:37:14 | 显示全部楼层
Post by rickxbx
年份需要列出四位,分两种情况,一种是 100 的倍数,一种不是 100 的倍数
( (_ 1_)00 )  |  ( (_2 _)  (_3 _) )

1 和 3 处是 01-99 之间的所有 4 的倍数
2 处任意

这样得到的就是所有闰年

呵呵 我白痴了

我还是觉得即使得到了完整的状态机也没有办法简化...能简化到什么程度?
回复 支持 反对

使用道具 举报

发表于 2005-8-23 19:15:20 | 显示全部楼层
Post by bbbush
我还是觉得即使得到了完整的状态机也没有办法简化...能简化到什么程度?

很难说能简化的什么程度
不过简化后如果根本看不出来他的意思,那还不如不简化
回复 支持 反对

使用道具 举报

发表于 2005-8-24 20:27:33 | 显示全部楼层
Post by rickxbx
很难说能简化的什么程度
不过简化后如果根本看不出来他的意思,那还不如不简化

嗯 有你说话的风格 几千公里都听出来了
给贴点好文章吧,你正在研究的项目
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表