轻松学正则表达式

正则表达式广泛用于查找、校验,无论使用什么语言开发,或者是日常工作中使用编辑器,掌握正则表达式都能带来效率上的收获。

我在别人的教程中看过一句话:“如果你觉得正则表达式很简单,要么你是一个天才,要么你不是地球人。”

不要被吓到,一旦理解正则后,其实也并不会那么难,而且它给我们带来的好处是毋庸置疑的。本文尽量用通俗易懂的语言将正则的规则描述清楚。

开始^和结束$

^$分别匹配开始和结束,常见的正则表达式通常包含了^$,并不是说正则表达式本身必须包含这两个标识,而是说“从头到尾匹配整个字符串”。

  • ^帅气:以“帅气”开头
  • 帅气$:以“帅气”结尾
  • ^帅气$:只配陪“帅气”
  • 帅气:含有“帅气”

元字符和限定符

正则的目的是以规则匹配字符串,而正则表达式本身也是字符串,就要用占用部分字符或字符串来进行规则描述,元字符限定符就属于规则描述的一部分。

规则“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}$

按步骤理解:

  1. \d{1,3}表示1至3位数字
  2. \d{1,3}\.表示1至3位数字后面跟一个点
  3. (\d{1,3}\.){3}表示1至3位数字后面跟一个点,重复3次
  4. 最后再加一个\d{1,3}

以上正则可以简单的描述正则表达式的规则,但有一个问题:IP地址的区间应该是“0.0.0.0”到“255.255.255.255”,而以上正则表达式会匹配“300.556.900.650”这种错误的IP地址,因此我们需要将IPV4正则表达式进行修改。

但由于正则是匹配字符串的,无法直接提供0-255的数字大小区间,于是我们只能自己对其进行拆分。

按步骤分析:

  1. 描述250-255的规则:25[0-5]
  2. 描述200-249的规则:2[0-4]\d
  3. 描述100-199的规则:1\d{2}
  4. 描述0-99的规则:[1-9]?\d
  5. 将以上四步的规则进行|拼接,然后加上点 \.

于是得出^((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

其他

本文仅为帮助理解正则表达式使用规则,不建议作为参考手册使用,文中未尽知识如“正则表达式匹配中文”等,请自行百度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值