- UID
- 2
- 精华
- 积分
- 7736
- 威望
- 点
- 宅币
- 个
- 贡献
- 次
- 宅之契约
- 份
- 最后登录
- 1970-1-1
- 在线时间
- 小时
|
正则表达式入门经典 看了150页,精髓已经掌握了
要点元符号:
\<单词开始
\>单词结束
^行开始
$行结束
|逻辑并列
.一个字符
*零个或多个字符
+1个或多个字符
\直接量句点
\d数字
\D非数字
[]字符类
{m,n}最少m次,最多n次
\w英文字母数字下划线
\W 匹配\w不匹配的字符
\s单个空白字符
\S非空白字符
\t制表符
\n换行符
\b回格符 词边界
^作为字符类首字符时表示对字符类取反
&&逻辑与
有一个例子是匹配ip地址的,但是书上给的答案不能匹配形如061.25.255.000这种,因此我做了修改,可以匹配任意ip:\<([0-9]|[1-9][0-9]|[01][0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|[01][0-9][0-9]|2[0-4][0-9]|25[0-5])){3}\>
另一个例子是检测日期正确性,例如1999-01-01
为了枚举实例验证,我用了windows 命令提示符,写下如下命令,生成1900-1-1至2100-1-1所有日期字符串:for /L %i in (1900,1,2100) do (for /L %j in (1,1,12) do (for /L %k in (1,1,31) do echo %i-%j-%k >> C:\Users\Administrator\Desktop\and.txt))
我这个表达式可以检测每个月日期是否正确,但是无法判断平年闰年,2月就当有29日,不过对于初步检测,完全够了。
分析如下:
1 3 5 7 8 10 12:1-31
1-9
01-09
10-29
30-31
((0?[13578])|10|12)\-((0?[1-9])|[12][0-9]|3[01])
2:1-29
1-9
01-09
10-29
0?2\-((0?[1-9])|[12][0-9])
4 6 9 11:1-30
1-9
01-09
10-29
30
((0?[469])|11)\-((0?[1-9])|[12][0-9]|30)
最后得到:\<((19|20)[0-9][0-9]\-((((0?[13578])|10|12)\-((0?[1-9])|[12][0-9]|3[01]))|0?2\-((0?[1-9])|[12][0-9])|((0?[469])|11)\-((0?[1-9])|[12][0-9]|30)))\>
|
|