0. 写在前面
在开发中, 正则表达式常用于邮箱, 手机号的校验, 文本的批量查找, 替换等操作.
大部分同学, 在拿到需求的时候, 第一件事一定是打开浏览器, 搜索: 邮箱 正则表达式 怎么写, 然后 Ctrl C + V, 测试几个条件没问题, 就提交了, 出了问题也不知道怎么修改, 只能再求救热心网友.
本篇文章, 主要带大家了解一下, 正则表达式的基本用法, 有个初步的了解, 看到正则后不再一脸懵.
比如 IPv4 地址的正则表达式:
^([1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.(0|[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$
如果你没看过本篇文章, 第一眼看到这个表达式一定有点头晕, 乱七八糟写的是啥, 别担心, 学完后你就会发现, 那些看似复杂的表达式, 其实也不过如此.
本篇文章主要内容的思维导图, 后续可用于快速查询:
思维导图
1. 特殊单字符
在正则表达式中, 普通字符表示的还是原来的意思, 比如表达式 1 可以匹配到数字 1, 表达式 a 可以匹配到字母 a.
但是如果想要匹配到更多字符的时候, 我们不可能把所有的字符都列一遍, 这样就太浪费时间了, 那有什么更好的办法呢, 接下来就是元字符大显身手的时间了.
. 点号通配符, 可以匹配到除换行外的任意字符:
点号通配符
\d 数字通配符, 可以匹配到数字 0-9
\D 如果将 D 大写, 则匹配到的是任意非数字, 相当于 \d 的反义
数字通配符
\w 字母数字下划线通配符, 可以匹配到任意的字母数字下划线
\W 如果将 W 大写, 则匹配到的是任意非字母数字下划线
字母数字下划线通配符
\s 空白符通配符, 可以配到任意空白符, 包括回车, 换行, 换页, 制表符等
\S 如果将 S 大写, 则匹配到的是任意非空白符
空白符通配符
到这里, 特殊单字符就讲完了, 汇总下:
特殊单字符
2. 空白符
空白符分为下图中的几类, 一般我们用 \s 表示就可以了:
空白符
3. 范围
* 星号, 代表出现 0 到多次, 可以出现, 也可以不出现, 出现的话, 不限制次数
+ 加号, 代表出现 1 到多次, 也就是至少出现一次的意思
? 问号, 代表出现 0 到 1 次, 比如 Http 协议的正则就可以用 Https? 表示
{m} 代表出现 m 次, 比如 a{1} 就表示匹配的规则中, 字母 a 只能出现 1 次
{m,} 代表至少出现 m 次,{0,} 相当于星号,{1,} 相当于加号
{m,n} 代表出现 m 到 n 次,{0,1} 相当于问号
范围
4. 量词
| 或, 和你心中想的那个或是一样的, ab|bc 可以匹配到 ab 或者 bc
[...] 多选一, 比如 [abc] 可以匹配到字母 a, 也可以匹配到字母 b 或 c
[a-z] 匹配 a 到 z 之间的任意元素,\w 这个通配符就可以用 [a-zA-Z0-9_] 来表示
[^...] 取反, 不能是括号内的任意单个元素
注意: 以上的表达式每次只能匹配到单个元素
量词
5. 实战
现在我们再回过头来, 看下文章开头的正则表达式:
^([1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.(0|[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$
是不是觉得有点思路了, 下面我们一起来实现下, 先讲讲规则:
IPv4 地址的范围, 我们定义为 1.0.0.0 - 255.255.255.255, 当然专业上肯定有更严格的定义划分, 我们此处不纠结
通过以上范围, 我们可以得出基本规则 [1-255].[0-255].[0-255].[0-255]
可以看出后三位是重复的 .[0-255], 所以我们只需要先写出 [0-255] 的规则, 后面就很简单了
^ 和 $ 用于标识行的开始和结束, 这个我们下一篇文章会讲到
开始吧:
1. 如何表达一个两位数字的范围
通过上面的学习, 我们知道一个数字可以用 \d 或 [0-9] 来表示, 如果要表达多位数呢, 比如 0-99.
可以这样拆分, 0-99 的范围, 最少的位数是 1 位, 最多的位数是 2 位, 那我们可以用 2 个数字通配符来表示, 为了清晰和美观, 我们此处用 [0-9] 表示.
写起来就是:
0|[1-9][0-9]?
其中, 0 代表数字 0, 因为要排除 00 的情况, 所以不能使用 [0-9][0-9]? 来表示, 中间有个或 |, 后面的 [1-9][0-9]? 表示 1-99, 还记得 ? 的含义吗, 代表出现 0 到 1 次.
2. 如何表达一个三位数字的范围
两位的写完了, 三位的就很简单了, 我们来写下 0-255 的范围.
这里要注意下:
当数字达到 3 位的时候, 百位只能是 1 或 2
当百位数字是 2 的时候, 十位数字只能是 0-5
当十位数字是 5 的时候, 个位数字只能是 0-5
来写一下:
0|[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-5]
0-255 到范围写完了, 去掉 0 就成了 1-255 的范围:
[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-5]
3. 组合
最后组合下, 还记得 {3} 的含义吗, 代表这个字符或组合出现 3 次:
注意:. 点号别忘了用 \ 转义下
^([1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.(0|[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$
大功告成, 有没有豁然开朗的感觉, 验证下:
IPv4
6. 写在最后
到这里, 正则表达式的基本用法就讲完了, 如果有问题可以给我留言评论, 谢谢.
正则表达式在线校验工具: https://regex101.com/
下一篇文章, 我们来一起学习下正则的断言机制, 敬请期待!
来源: http://www.jianshu.com/p/323c6f3afa62