作为一名程序员,不会写正则表达式总感觉少了点什么,不要求你能把正则玩出花来,但最起码要对常用的正则表达式手到擒来,刚毕业的我对于正则也是一头雾水,不过学会它也就一篇教程的事情
本文我不会再浪费带宽把正则的规则再次重复一遍,而是从实际入手,直接告诉你为什么这么写
16进制颜色
按照规则来
- 以
#开头 - 后面紧跟着6个字符或者3个字符作为结尾,这些字符可以是
a-f的小写字母、A-F的大写字母、数字
第一句,可以写成 /^#/;第二句,[a-fA-F0-9] 表示任意的 a-f、A-F、0-9,6或 3的个数可以用 {6}、{3}进行表示,那么6个字符就是 [a-fA-F0-9]{6},6个字符就是 [a-fA-F0-9]{3},这两个都有可能,用一个或(|)符号来连接:([a-fA-F0-9]{6}|[a-fA-F0-9]{3}),最后结尾可以用个 $
所有合到一起就是 /^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/
链接
目标是匹配出协议、域名、端口号port、path、search
-
协议
合法的协议有http、https,还有一个是自适应协议,即不明确加协议,跟当前页面的协议保持一致,所以以下都是合法的:http://toutiao.com、https://toutiao.com、//toutiao.com。
这三个协议组成的链接共同点是肯定有//字符串,在//的前面可能是https:也可能是http:也可以没有任何字符串
先按照https://这种写规则:^https:\/\/,其中的s字符可能有也可能没有,所以使用?修饰:^https?:\/\/,又因为https?:可能没有,所以这个字符串也用?修饰:^(https?:)?\/\/ -
域名
域名的前面可能是//,从//往后面匹配,只要没有代表:的port、代表search的?、代表path的/,那么就都属于域名:[^?:/]+ -
端口号
port
端口号肯定以:开头,后面跟着的只要是数字就都属于port::\d+,由于不一定有端口号,所以用?修饰:(:\d+)? -
path
肯定以/开头,只要不遇到代表search的?,那么就都属于path:\/[^?]*,由于可能没有path,所以用?修饰:(\/[^?]*)? -
search
肯定以?开头,后面所有的字符都属于search(不考虑hash路由):\?(.*),由于可能没有search,所以用?修饰:(\?.*)?
最后把上面所有规则合起来就是提取链接的完整正则了,考虑到需要精确提取所需要的部分,所以会对所需要提取的部分加上小括号,结果为:/^((https?):)?\/\/([^?:/]+)(:(\d+))?(\/[^?]*)?(\?(.*))?/
邮箱
以前在知乎上看到过一段邮箱正则,号称是最符合标准的正则表达式,那条正则的体积好像有几十KB吧,总之很长,现在找不到了,这里只关注常用的邮箱格式,规则:名称允许汉字、字母、数字,下划线,中划线,域名可以有数字、字母、下划线、中划线组成
汉字的范围是 [\u4e00-\u9fa5],字母的范围是 [a-zA-Z],数字的范围是 [0-9],合起来组成邮箱的名称 ^[A-Za-z0-9-_\u4e00-\u9fa5]+
域名是 [a-zA-Z0-9_-]+,域名后缀可以是多级域名 (\.[a-zA-Z0-9_-]+)+
上面组合起来就是 ^[A-Za-z0-9-_\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$
手机号
手机号的号段可能是会增加的,所以在实际场景中不建议限制得太死了
本正则按照以下规则编写:
- 11位数字,以数字
1开头,即^1 - 接下来的数字如果是
3,那么3后面可以跟一个任意数字,

本文从实际应用出发,详细解析了16进制颜色、链接、邮箱、手机号、数字/货币金额、身份证号、密码校验、HTML标签数据提取的正则表达式编写方法。通过实例,帮助程序员快速掌握常用正则表达式的编写技巧。
最低0.47元/天 解锁文章
2万+

被折叠的 条评论
为什么被折叠?



