LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: jiazhengw

多发发一些有意思的题做做呀![+sed/awk/regex练习]

[复制链接]
发表于 2006-3-9 15:08:14 | 显示全部楼层
Post by yongjian
我说过这个练习是做纯regex(正则表达式)的。不是用awk/sed来做的。请看清题目的要求。


是啊,关键就是用regexp表示,个人认为还是有难度的,努力中...
回复 支持 反对

使用道具 举报

发表于 2006-3-9 15:22:13 | 显示全部楼层
regexp   好象没有比较大小的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-11 15:15:08 | 显示全部楼层
好,我来试试RE!我先作第一题IP类型的。
1. 一个真实的IP地址的表达式. 以xxx.xxx.xxx.xxx表达。
(([0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5])\.){3}([0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5])
注:a.偷懒了,用扩展正则,呵呵。
b.在我的RH9上,元字符“{}”不用反斜杠转义,不知其它的机子上如何,没试过。

2. 一个A类地址的表达式。
([0-9]|[1-9][0-9]|[1][0-1][0-9]|[1][2][0-7])(\.([0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5])){3}

3. 一个B类地址的表达式。
([1][2][8-9]|[1][3-8][0-9]|[1][9][0-1])(\.([0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5])){3}

4. 一个C类地址的表达式。
([1][9][2-9]|[2][0-3][0-9]|[2][4][0-3])(\.([0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5])){3}

5. 9.80.1.15 - 9.83.253.100 的所有IP表达式(netmask = 255.252.0.0)
9\.8[0-3](\.([0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5])){2}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-11 15:36:48 | 显示全部楼层
我认为RE中就是要将所有可能的情况都列出来,再考虑限制因素。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-11 16:39:42 | 显示全部楼层
时间类型:
1. 一年的第xxx天。(一年以小于366天为准)
([0-9]|[1-9][0-9]|[1-2][0-9][0-9]|[3][0-5][0-9]|[3][6][0-6])

2. 一个月的任何一天。(以mm/dd表示)
(02\/[0-2][0-9]|0[13578]\/[0-2][0-9]|0[13578]\/3[0-1]|\
1[02]\/[0-2][0-9]|1[02]\/3[0-1]|0[469]\/[0-2][0-9]|0[469]\/30|11\/[0-2][0-9]|11\/30)

3. 2004年的任何一天。(以yyyy/mm/dd表示)
2004年是闰年,2月份有29天。上题中加一个2004/就可以了。
2004\/(02\/[0-2][0-9]|0[13578]\/[0-2][0-9]|0[13578]\/3[0-1]|\
1[02]\/[0-2][0-9]|1[02]\/3[0-1]|0[469]\/[0-2][0-9]|0[469]\/30|11\/[0-2][0-9]|11\/30)

4. 一天的任何一个时间点。(以HH:MM表达)
([01][0-9]:[0-5][0-9]|2[0-3]:[0-5][0-9])

5. 从16:10 - 第二天12:30的任何一个时间点。(以HH:MM表达)
(16:[1-5][0-9]|1[01789]:[0-5][0-9]|2[0-3]:[0-5][0-9]|0[0-9]:[0-5][0-9]|12:[0-2][0-9]|12:30)

6. 从2004年7月12日到2006年10月22日的任何一天。(以yyyy/mm/dd表达)
哇,这个的正则表达式真的很长!
(2004\/(07\/1[2-9]|07\/2[0-9]|(07|08|10|12)\/3[0-1]|(08|09|10|11|12)\/[0-2][0-9])\
|2005\/(02\/([0-1][0-9]|2[0-8])|0[13578]\/[0-2][0-9]|0[13578]\/3[0-1]|1[02]\/[0-2][0-9]|\
1[02]\/3[0-1]|0[469]\/[0-2][0-9]|0[469]\/30|11\/[0-2][0-9]|11\/30)|2006\/(02\/([0-1][0-9]|2[0-8])|\
0[13578]\/[0-2][0-9]|0[13578]\/3[0-1]|10\/([0-1][0-9]|2[0-2])|0[469]\/[0-2][0-9]|0[469]\/30))
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-11 18:13:15 | 显示全部楼层
做到一半时试了一下()原来是可以嵌套的,也懒得改了,呵呵!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-11 19:18:17 | 显示全部楼层
数字:
1. 有这样一个两位数,十位上的数总是比个位上的大。
([1-9]0|[2-9]1|[3-9]2|[4-9]3|[5-9]4|[6-9]5|[7-9]6|[8-9]7|98)

2. 匹配从x03D9 - x8E9B 的所有16进制数。
x(03D[9A-F]|03[EF][0-9A-F]|0[4-9A-F][0-9A-F]{2}|[1-7][0-9A-F]{3}|8E9[0-9AB]|8E[0-8][0-9A-F]|8[0-9A-D][0-9A-F]{2})

电话:
0xx-xxx-xxx-xxxx的表达形式。
1. 第一个xx为任何一个两位数,不可以是00
2. 第二个xxx为任何一个3为数,不可以是,110,120,119,911,160.
3.第三个xxx为任何一个三位数,不可以是000.
4.第四个xxxx可以为任何4位数。
0([0-9][1-9]|[1-9][0-9])-(11[1-8]|12[1-9]|10[0-9]|1[345789][0-9]|16[1-9]|[2-8][0-9][0-9]|9[02-9][0-9]|91[02-9])-([1-9][0-9][0-9]|0[1-9][0-9]|00[1-9])-[0-9]{4})

字符:
代码:

"with \"t\" + '\<user@domain.com\>' and \"b\"."
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-11 19:54:31 | 显示全部楼层
最后一题主要是特殊字符的问题,用grep试了好多,不行,还是出不来,难道只能用fgrep吗?
我用egrep试,
\" + '\<user@domain.com\>' and
这个都行。也就是说
  1. egrep "\\"\ \+\ '\\\<user@domain\.com\\\>'\ and" file
复制代码
都行,但是前加了t就不行!即:
  1. egrep "t\\"\ \+\ '\\\<user@domain\.com\\\>'\ and" file
复制代码
就出不来了。不知咋回事?加了\t也不行。
郁闷!!!
  1. with\ \\"t\\"\ \+\ '\\\<user@domain\.com\\\>'\ and\ \\"b?\\"\.
复制代码

不会有太大的错吧。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-13 09:33:16 | 显示全部楼层
今天看来,我的正则是不是太复杂、太笨了一点,感觉上应该还有更简单更巧妙的。yongjian 版主帮忙看看指点指点!尤其是“十位上的数总是比个位上的大”这一题,总觉得做得有问题,太笨了。还有最后一个包含元字符的这一题,请给出标准答案吧。我又用egrep试了,还是不能出来正确的结果。
回复 支持 反对

使用道具 举报

发表于 2006-3-13 10:14:49 | 显示全部楼层
两位数那个你写反了。先做做吧。有些题还要多想想。
回复 支持 反对

使用道具 举报

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

本版积分规则

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