一文详解正则表达式

正则表达式,是一个强大且高效的文本处理工具。通常情况下,通过一段表达准确的表达式,能够非常简短、快速的实现复杂业务逻辑。

因此,正则表达式通常是一个成熟开发人员的标配,可以辅助实现开发效率的极强提升。

在需要实现校验字段、字符串等内容时,通常就可以通过正则表达式实现:。比如我们经常会对用户输入做校验:手机号,身份证号,邮箱,密码,域名,IP 地址,URL 或者其他与字符串相关校验的业务场景。很多不太懂正则的朋友,在遇到需要用正则校验数据时,往往是在网上去找很久,结果找来的还是不很符合要求。所以我最近把开发中常用的一些正则表达式整理了一下,在这里分享一下。给自己留个底,也给朋友们做个参考。

正则表达式就是一种强大而灵活的文本处理工具,正则可以很好的解决这类字符串校验问题。掌握正则表达式,就能大大提高开发过程的效率。

常见表达式

n位的数字:^\d{n}$
至少n位的数字:^\d{n,}$
m-n位的数字:^\d{m,n}$
零和非零开头的数字:^(0|[1-9][0-9])$
非零开头的最多带两位小数的数字:^([1-9][0-9]
)+(.[0-9]{1,2})?$
带1-2位小数的正数或负数:^(-)?\d+(.\d{1,2})?$
正数、负数、和小数:^(-|+)?\d+(.\d+)?$
非零的负整数:^-[1-9][]0-9"$ 或 ^-[1-9]\d$
非负整数:^\d+$ 或 1\d*|0$
非正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
非负浮点数:^\d+(.\d+)?$ 或 2\d*.\d*|0.\d*[1-9]\d*|0?.0+|0$
非正浮点数:^((-\d+(.\d+)?)|(0+(.0+)?))$ 或 ^(-([1-9]\d*.\d*|0.\d*[1-9]\d*))|0?.0+|0$
负浮点数:^-([1-9]\d*.\d*|0.\d*[1-9]\d*)$ 或 ^(-(([0-9]+.[0-9][1-9][0-9])|([0-9][1-9][0-9].[0-9]+)|([0-9][1-9][0-9])))$
浮点数:^(-?\d+)(.\d+)?$ 或 ^-?([1-9]\d*.\d*|0.\d*[1-9]\d*|0?.0+|0)$
由数字、26个英文字母或者下划线组成的字符串:^w+$ 或 ^w{3,20}$

那么什么是正则表达式:

正则表达式(Regular Expression)在代码中常常简写为regex。正则表达式通常被用来检索、替换那些符合某个规则的文本,它是一种强大而灵活的文本处理工具。

正则表达式的语法规则

学习正则表达式语法,主要就是学习元字符以及它们在正则表达式上下文中的行为。
元字符包括:普通字符、标准字符、特殊字符、限定字符(又叫量词)、定位字符(也叫边界字符)。下面分别介绍不同元字符的用法。

普通字符

字母[a-zA-Z]、数字[0-9]、下划线[-]、汉字,标点符号:
匹配字母a可以 regex=a
匹配字母b可以 regex=b
匹配字母a或者b可以 regex=a|b,这个正则引入一个特殊字符“|”,专业名称为“或”,你也可以叫它“竖线”,它表示“或”的意思。
匹配字母a或者b或者c可以 regex=a|b|c
匹配字母a或者b或者c或者d可以 regex=a|b|c|d
如果匹配所有26个字母,这种写法明显很二了。
这里引入两个特殊字符方括号“[ ]”和中划线“-” “[ ]”,专业名称为“字符集合”,你也可以叫它“方括号”。
“-” ,表示“范围”,你也可以叫它“到”,regex=[A-Z] 匹配从A到Z26个字母中的任意一个。
那么匹配字母a或者b或者c或者d可以 regex=[abcd]。
匹配数字1到8的任意数字可以 regex=[1-8],这样就不会匹配到0与9这2个数字了,如下:

标准字符集合
标准字符集合是能够与“多种普通字符”匹配的简单表达式,比如:\d、\w、\s。
匹配数字0到9的任意数字可以 regex=[0-9] 也可以 regex=\d。标准字符集要注意区分大小写,大写是相反的意思。
regex=\D,则匹配非数字字符,即不能匹配数字0到9,如下:

常用的标准字符说明 标黄的要熟记。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190730090720383.在这里插入图片描述

特殊字符

特殊字符在正则表达式中表示特殊的含义,比如:,+,?,\,等等。
“\”是转义字符,用于匹配特殊字符
匹配反斜杠“\”可以 regex=\,因为“\”是特殊字符,所以需要在它前边再加一个“\”进行转义
匹配星号“
”,可以 regex=\,因为“\”是特殊字符,所以需要在它前边再加一个“\”进行转义
常用的特殊字符说明 标黄的要熟记。
在这里插入图片描述

限定字符

限定字符又叫量词,是用于表示匹配的字符数量的。
匹配任意1位数字可以 regex=\d
匹配任意2位数字可以 regex=\d\d
匹配任意3位数字可以 regex=\d\d\d
匹配任意8位数字,再这么写就有点二了。这里引入用于表示数量限定字符“{n}”。“{n}”,n是一个非负整数,匹配确定的n次。
注意:regex=\d\d{3} 匹配任意4个数字不是6个,量词只对它前面的字符负责,
匹配任意8位数字可以 regex=\d{8}
匹配任意8位以上的数字可以 regex=\d{8,}
匹配任意1到8位以上的数字可以 regex=\d{1,8}
regex=\d{1,8},可以匹配到任意1-8个数字,超过8位数字后,从新开始匹配。
匹配次数中的“贪婪模式”与“非贪婪模式”:
正则的匹配默认是贪婪模式,即匹配的字符越多越好,而非贪婪模式是匹配的字符越少越好,在修饰匹配字数的量词后再加上一个问号“?”即可。
那么regex=\d{1,8}?匹配到什么呢?
因为在{1,8}这个量词后面加上了问号“?”,表示非贪婪模式,所以只能匹配到1个数字,即匹配的字符越少越好。
常用的限定字符说明 标黄的要熟记。
在这里插入图片描述
匹配0个或多个字母A可以 regex=A* 或者 regex=A{0,}
匹配至少一个字母A可以 regex=A+ 或者 regex=A{1,}
匹配0个或1字母A可以 regex=A?或者 regex=A{0,1}
匹配至少一个 Hello可以 regex=(Hello)+,匹配的效果如下:
在这里插入图片描述

定位字符

定位字符也叫字符边界,标记匹配的不是字符而是符合某种条件的位置,所以定位字符是“零宽的”。
常用的定位字符:
在这里插入图片描述
匹配以 Hello 开头的字符串可以 regex=^Hello
匹配以 Hello 结尾的字符串可以 regex=Hello$
匹配以H开头以o结尾的任意长度字符串可以regex=^H.*o$
\b匹配这样一个位置:前面的字符和后面的字符不全是\w。如果在“hello,hello1 helloregex,hello regexhello.”这个字符串里匹配regex=hello\b,匹配到的结果如下:
在这里插入图片描述

自定义字符集合

方括号[ ]表示字符集合,即[ ]表示自定义集合,用[ ]可以匹配方括号里的任意一个字符。
regex=[aeiou] 匹配“a”,“e”,“i”,“o”,“u”任意一个字符,也就是可以匹配集合 [aeiou] 的任意一个字符。
但是,特殊字符(除了小尖角“^”和中划线“-”外)被包含到方括号中,就会失去特殊意义,只代表其字符本身。
regex=[abc+?] 匹配“a”,“b”,“c”任意一个字符或者**“+”,“\”,“?”,即包含在自定义集合中的特殊字符“+”,“*”,“?”**失去了特殊含义,只表示其字符本身的意思。
特殊字符小尖角“^”,原本含义是匹配字符串的开始位置,如果包含在自定义集合[ ]中,则表示取反的意思。
比如:regex=[^aeiou] 匹配“a”,“e”,“i”,“o”,“u”之外的任意一个字符。
中划线“-”,在自定义集合[ ]中,表示“范围”,而不是字符“-”本身,regex=[a-z],匹配从a到z中26个字母中的任意一个。
除小数点“.”外,标准字符集合包含在方括号中,仍然表示集合范围。regex=[\d.+] 匹配0-9的任意一个数字或者小数点“.”或者加号“+”
也就是说\d在自定义集合中仍然表示数字,但是小数点在字符集合中只表示小数点本身,而不是除“\r\n”之外的任何单个字符。
选择符和分组
在这里插入图片描述
regex=x|y,匹配字符x或y。( )表示捕获组,( )的作用如下:
括号中的表达式可以作为整体被修饰,用来表示匹配括号中表达式的次数,regex=(abc){2,3},可以匹配连续的2个或3个abc,如下:
在这里插入图片描述
括号中的表达式匹配到的内容会存储起来,并可以获取到括号中表达式匹配到的内容
每一对括号会分配一个编号,使用( )的捕获根据左括号的顺序从1开始自动编号,编号为0的捕获是整个正则表达式匹配到的文本。
捕获组( )可以把匹配的内容存储起来,那么如何获取( )捕获到的内容呢,下面介绍反向引用。
反向引用 “\number”
每一对括号会分配一个编号,使用( )的捕获根据左括号的顺序从1开始自动编号。
通过反向引用,可以对分组已捕获的字符串进行引用。“\number” 中的 number 就是组号
regex=(abc)d\1 可以匹配字符串 abcdabc,即\1表示把获取到的第一组再匹配一次,如下:
在这里插入图片描述
(?:pattern) 表示非捕获组,匹配括号中表达式匹配到的内容,但是不进行存储匹配到的内容。
这在使用 “或” 字符?(|)?来组合一个正则的各个部分是很有用的。
例如:匹配字符 “story” 或者 “stories”,regex=stor(?:y|ies) 就是一个比 regex=story|stories 更简略的表达式。

预搜索

预搜索,又叫零宽断言,又叫环视,它是对位置的匹配,与定位字符(边界字符)类似。
在这里插入图片描述
regex=love (?=story)匹配的结果如下(匹配 “love?” 后面是 story):
在这里插入图片描述
regex=love (?!story)匹配的结果如下(匹配 “love” 后面不能是 story):
在这里插入图片描述

运算符的优先级

正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似。下表的优先级从高到低排序。
在这里插入图片描述
开发过程中使用正则表达式的流程
分析所要匹配的数据特点,模拟各种测试数据;
利用正则工具,写正则表达式与测试数据进行匹配,从而验证你写的正则;
在程序里调用在正则工具中验证通过的正则表达式。

电话号码的正则

电话号码由数字和“-”组成
如果包含区号,那么区号为三位或四位,首位是0
区号用“-”和其他数字分割
除了区号,电话号码为7到8位
手机号码为11位
11位手机号码的前2位为“13”,“14”,“15”,“17”,“18”
分析
电话号码分为固话和手机号,首先匹配固话,然后匹配手机号。
固话的正则:regex=0\d{2,3}-\d{7,8}
手机号的正则:regex=1[34578]\d{9}
所以电话号码的正则:
regex=(0\d{2,3}-\d{7,8})|(1[34578]\d{9})
电话号码匹配结果如下:
在这里插入图片描述

身份证号码的正则

长度:15位或者18位
如果是15位,则都是数字
如果是18位,最后一位可能为数字或字母X
分析
15位数字:regex=\d{15}
18位数字:regex=\d{18}
17位数字+X:regex=\d{17}X|x
所以省份证号码的正则:
regex=(\d{15}$)|(^\d{18}$)|(\d{17}X|x$)
身份证号码匹配的结果如下:
在这里插入图片描述

电子邮箱的正则

邮箱格式:用户名@网址.域名
用户名:字母、数字、下划线组成
网址:字母、数字
域名:2-4位字母组成,1-2个域名
不区分大小写
分析
用户名:regex=\w+。
网址:regex=[a-zA-Z0-9]+。
所以电子邮箱的正则 regex=\w+@[a-zA-Z0-9]+(.[a-zA-Z]{2,4}){1,2}。
电子邮箱匹配的结果如下:
在这里插入图片描述

IP地址的正则

IP地址的格式:(1255).(0255).(0255).(0255)
分析
1-255的正则 regex=^([1-9]|[1-9]\d|1\d\d|2[0-5][0-5])。
0-255的正则 regex=^(\d|[1-9]\d|1\d\d|2[0-5][0-5]) 。
所以 IP 地址的正则 regex=^([1-9]|[1-9]\d|1\d\d|2[0-5][0-5]).((\d|[1-9]\d|1\d\d|2[0-5][0-5]).){2}(\d|[1-9]\d|1\d\d|2[0-5][0-5])$
IP地址匹配的结果如下:
在这里插入图片描述

日期格式的正则

日期格式:yyyy-mm-dd
分析
4位的年,第一位只能是1或2,regex=^([12]\d{3})
一年的12个月(01~09和1~12),regex=^(0?[1-9]|1[0-2])
一个月的31天(01~09和1~31), regex=^((0?[1-9])|((1|2)[0-9])|30|31)
所以 格式为 yyyy-mm-dd 的日期正则 regex=^([12]\d{3})-(0?[1-9]|1[0-2])-(0?[1-9]|((1|2)[0-9])|30|31)$
yyyy-mm-dd 的日期匹配的结果如下:
在这里插入图片描述

其他正则实例

1校验密码强度

密码的强度必须是包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间。

在这里插入图片描述

2校验中文

字符串仅能是中文。

在这里插入图片描述

3由数字、26个英文字母或下划线组成的字符串

在这里插入图片描述

4校验金额

金额校验,精确到2位小数。

在这里插入图片描述

5判断IE的版本

IE目前还没被完全取代,很多页面还是需要做版本兼容,下面是IE版本检查的表达式。

在这里插入图片描述

6校验IP-v4地址

IP4 正则语句。

在这里插入图片描述

7校验IP-v6地址

IP6 正则语句。
在这里插入图片描述

8检查URL的前缀

应用开发中很多时候需要区分请求是HTTPS还是HTTP,通过下面的表达式可以取出一个url的前缀然后再逻辑判断。
在这里插入图片描述

9提取URL链接

下面的这个表达式可以筛选出一段文本中的URL。

在这里插入图片描述

10文件路径及扩展名校验

验证windows下文件路径和扩展名(下面的例子中为.txt文件)

在这里插入图片描述

11提取Color Hex Codes

有时需要抽取网页中的颜色代码,可以使用下面的表达式。

在这里插入图片描述
12提取网页图片

假若你想提取网页中所有图片信息,可以利用下面的表达式。

在这里插入图片描述

13提取页面超链接

提取html中的超链接。

在这里插入图片描述

14查找CSS属性

通过下面的表达式,可以搜索到相匹配的CSS属性。

在这里插入图片描述
15抽取注释

如果你需要移除HMTL中的注释,可以使用如下的表达式。

在这里插入图片描述

16匹配HTML标签

通过下面的表达式可以匹配出HTML中的标签属性。

在这里插入图片描述


  1. 1-9 ↩︎

  2. 1-9 ↩︎

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值