正则表达式详解
概念
正则表达式描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。
我们如果写好一个正则表达式,那就相当于说明了一个字符匹配规则
语法
[可选字符列表]
无论里面可选字符究竟有多少,我们只能选一个
举个例子,比如我们要验证一个6位数字,我们要写成
[0123456789][0123456789][0123456789][0123456789][0123456789][0123456789]
可以感觉到太麻烦了,所以我们改写成
[0-9][0-9][0-9][0-9][0-9][0-9]
这句话的意思就是六位数字
可以看出这个[]中不管怎么选都只能选一个
字符串选区[a-z]小写所有字符选一
[A-Z]大写所有字符选一
[A-Za-z]所有单词字符选一
[A-Za-z0-9]单词与数字字符选一
[^反选字符列表]
举个例子
[^47]就是除了4和7都可以填
预定义字符集
这是用来简化常规代码的字符集
“\d”–>[0-9]–>1位数字
“\w”–>[0-9a-zA-Z_]–>1位字母,数字或_
“\s”–>1位空字符:匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
“ . “: 除换行回车外的任何一个字符,如:
“a.[0-9]”:表示一个字符串有一个"a"后面跟着一个任意字符和一个数字;
“^.{3}$”:表示有任意三个字符的字符串(长度为3个字符)
\t--------匹配一个制表符
预定义字符的反义:预定义字符的大写形式都是小写的反义
\D---->1位非数字字符
\S------匹配任何非空白字符。等价于 [^\f\n\r\t\v]。
\v------匹配一个垂直制表符
\n------匹配一个换行符
\r-------匹配一个回车符
数量词
数量词可以帮我们规定某段代码可以重复出现的次数
语法是
{n}:表示必须出现n位
{n,m}:表示必须最少出现n次或最多出现m次
{n,}:表示最少出现n次,多了不限
{0,m}:表示可以不出现或者最多出现m次
举例:
手机号规则:
第1位:只能是1
第2位:[34578]
第3位之后,必须是9位数字
手机号:/^1[34578]\d{9}$/
不确定数量
*: 有没有都行,次数不限,相当于{0,}
+: 至少1次,重复次数不限,相当于{1,}
?: 有没有都行,最多1次,相当于{0,1}
():分组
|: 左右两正则表达式选其一
身份证号逻辑:
前15位数字
16,17位必须是数字
最后一位可以是数字或X x
后三位 可有可无,如果有,只能出现一次
\d{15}(\d\d[0-9Xx])?
指定匹配位置
^表达式: 必须以表达式的规则为开头
表达式$: 必须以表达式的规则为结尾
比如:选择字符串开头的空格?^\s*
选择结尾空格?\s*$
选择开头或结尾的空格?^\s*|\s*$
如果今后要在程序中进行验证,必须前后加好^和$
预判
在正式匹配正则表达式之前,先预读整个字符串,进行初步匹配,如果预判都未通过,则不再验证!
(?=表达式)
表示是否存在表达式里的内容
例子:4位数字,但不能包含4和7
(?=[^47]$) 是否由除了4,7之外的字符组成
(?!表达式)
先检查字符串是否不满足表达式要求
比如:6位以上密码。
字母,数字组成
首字母不能是数字: [a-zA-Z][a-zA-Z0-9]{5,}
必须至少包含1个大写字母
不能都由小写字母和数字组成: (?![a-z0-9]+$)
必须至少包含1个数字
不能都由小写字母和大写字母组成:
(?![a-zA-Z]+$)
贪婪模式和懒惰模式
贪婪模式:默认情况下,正则表达式会匹配最大的符合条件的字符串, *、+和?限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。
懒惰模式:正则表达式仅匹配最小的符合规则的字符串
比如:筛选网页中的a元素:
<a\s+(.*)href\s*=\s*["’]([^’"]*)["’] 这就是贪婪模式的使用方法