正则表达式广泛用于查找、校验,无论使用什么语言开发,或者是日常工作中使用编辑器,掌握正则表达式都能带来效率上的收获。
我在别人的教程中看过一句话:“如果你觉得正则表达式很简单,要么你是一个天才,要么你不是地球人。”
不要被吓到,一旦理解正则后,其实也并不会那么难,而且它给我们带来的好处是毋庸置疑的。本文尽量用通俗易懂的语言将正则的规则描述清楚。
开始^
和结束$
^
和$
分别匹配开始和结束,常见的正则表达式通常包含了^
和$
,并不是说正则表达式本身必须包含这两个标识,而是说“从头到尾匹配整个字符串”。
^帅气
:以“帅气”开头帅气$
:以“帅气”结尾^帅气$
:只配陪“帅气”帅气
:含有“帅气”
元字符和限定符
正则的目的是以规则匹配字符串,而正则表达式本身也是字符串,就要用占用部分字符或字符串来进行规则描述,元字符和限定符就属于规则描述的一部分。
规则“10个数字”中,我们将“10个”理解为限定符,将“数字”理解为元字符。
手机号码的正则^1\d{10}$
描述的规则是:“以‘1’开头,后面跟10个数字”。其中\d
表示“数字”,{10}
表示“10个”
常用的元字符:
元字符 | 说明 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线或汉字 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
常用的限定符:
限定符 | 说明 |
---|---|
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
转义符
由于元字符和限定符本身也是字符串,所以当我们要匹配一个问号,必须进行转移,否则会将“?”当成限定字符。于是匹配问号必须进行转移,正则中转义符为:\
如匹配问号用\?
;匹配转义字符本身用\\
括号
- 小括号
()
表示分组,即优先级 - 中括号
[]
表示区间,如[1-9]
表示1到9的数字 - 大括号
{}
表示次数限定,如{1,3}
表示最少一次,最多三次
反义^
代码/语法 | 说明 |
---|---|
\W | 匹配任意不是字母,数字,下划线,汉字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非数字的字符 |
\B | 匹配不是单词开头或结束的位置 |
[^帅] | 匹配除了“帅”以外的任意字符 |
[^帅气] | 匹配除了“帅气”这几个字母以外的任意字符 |
从上表可以看出^
符号有取反的意思,但要放在[]
以内,否则会被当成匹配开始。
注意,只要[]
中以^
开头,将对整个[]
中的内容取反
分支条件|
|
表示逻辑或,即多个条件只需要满足一个,不过多描述。
IPV4正则表达式
简单的将IPV4正则可写为 ^(\d{1,3}\.){3}\d{1,3}$
。
按步骤理解:
\d{1,3}
表示1至3位数字\d{1,3}\.
表示1至3位数字后面跟一个点(\d{1,3}\.){3}
表示1至3位数字后面跟一个点,重复3次- 最后再加一个
\d{1,3}
以上正则可以简单的描述正则表达式的规则,但有一个问题:IP地址的区间应该是“0.0.0.0”到“255.255.255.255”,而以上正则表达式会匹配“300.556.900.650”这种错误的IP地址,因此我们需要将IPV4正则表达式进行修改。
但由于正则是匹配字符串的,无法直接提供0-255的数字大小区间,于是我们只能自己对其进行拆分。
按步骤分析:
- 描述250-255的规则:
25[0-5]
- 描述200-249的规则:
2[0-4]\d
- 描述100-199的规则:
1\d{2}
- 描述0-99的规则:
[1-9]?\d
- 将以上四步的规则进行
|
拼接,然后加上点\.
于是得出^((25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))$
使用GO语言测试以上正则:
package main
import (
"fmt"
"regexp"
)
var exp= regexp.MustCompile("^帅气")
var ExpIPV4= regexp.MustCompile(`^((25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))$`)
func main() {
fmt.Println(exp.MatchString("帅气如我"))
fmt.Println(exp.MatchString("如我帅气"))
fmt.Println(ExpIPV4.MatchString("255.199.99.8"))
fmt.Println(ExpIPV4.MatchString("255.199.99.888"))
}
输出结果:
true
false
true
false
其他
本文仅为帮助理解正则表达式使用规则,不建议作为参考手册使用,文中未尽知识如“正则表达式匹配中文”等,请自行百度。