正则表达式详解
1、正则表达式构成
简介:描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
构成:/正则表达式/匹配模式
1.1、普通字符与元字符
- 匹配手机号中,是否含有字母a /a/ 像a这种含义与字面意义一样的字符,叫普通字符
- 匹配手机号中,是否需含有非数字 /\D/ 像\D这种含义与字面意义不同的字符,叫元字符
1.2、常用元字符
- \d: 数字
- \D: 非数字
- \w: 单词字符word 大写字母、小写字母、下划线_、数字
- \W: 非单词字符
- \s: 空白字符 空格、换行符、制表符tab 看不见但又真实存在的字符
- \S: 非空白字符
1.3、特殊符号
- ^:行开头
- ():定义子表达式
- []: 构建范围 [13579]
- {}:表示匹配的长度,{3}3个字符长度,{6,9}6-9个字符长度
- [^]:表达取反,如:匹配偶数 [24680] 或 [ ^13579]
- +:出现至少1次
- .:任意字符,除换行和回车之外
- *:任意次数
- ?:出现0或1次
- (.\d+)?:括号里内出现0或1次
- $:行结尾
1.4、匹配模式
- g:global 全局匹配 尝试在字符串的所有位置进行匹配
- i:ignore 忽略大小写 在匹配时,可以忽略大小写
1.5、正则三问
- 查什么:抓住要匹配的字符串特征 根据特征 选用合适的正则符号
- 查多少:说明这种字符出现的次数 量词 {} *+? {}?
- 在哪查:指定字符出现的位置 任意位置 紧跟 ^字符串起始位置 $字符串结束位置 \b单词边界 \B非单词边界
2、子表达式
2.1、定义子表达式
-
需求:匹配连续4位相同数字
三问:查什么=数字\d,查多少=4位,在哪查=任意位置
-
分析:
-
p1:先查出1个数字,
-
p2:再查后面3个数字与p1相同
/(\d)\1{3}/g #说明 ():定义子表达式 \d:数字 \1:第1个子表达式,即(\d) {3}:出现3次 g:全局匹配,在字符串的所有位置进行匹配
-
-
子表达式:/(子表达式1)(子表达式2)(子表达式3)/
子表达式1=\1,子表达式2=\2,子表达式3=\3
2.2、相关练习
-
匹配
AABB
格式的字符串:1122,开开心心,!!@@p1:查什么=任意字符,查多少=1个,在哪查=任意
p2:查什么=与P1相同,查多少=1个,在哪查=紧跟
p3:查什么=任意字符,查多少=1个,在哪查=紧跟
p4:查什么=与p3相同,查多少=1个,在哪查=紧跟
/(.)\1(.)\2/g
-
p1:查什么=<,查多少=1个,在哪查=任意
p2:查什么=字母,查多少=1个,在哪查=紧跟
p3:查什么=字母或数字,查多少=任意个,在哪查=紧跟
p4:查什么=>,查多少=1个,在哪查=紧跟
p5:查什么=任意字符,查多少=任意个,在哪查=紧跟
p6:查什么=</,查多少=1个,在哪查=紧跟
p7:查什么=与p2p3一样,查多少=1个,在哪查=紧跟
p8:查什么=>,查多少=1个,在哪查=紧跟
/<([a-z][a-z\d]*)>.*<\/\1>/i
-
匹配
ABAAB
格式的字符串:12112p1:查什么=任意字符,查多少=1个,在哪查=任意
p2:查什么=任意字符,查多少=1个,在哪查=紧跟
p3:查什么=与p1相同,查多少=2个,在哪查=紧跟
p4:查什么=与p2相同,查多少=1个,在哪查=紧跟
/(.)(.)\1{2}\2/g
3、选择匹配符
3.1、使用选择匹配符
需求:匹配 xiaobai
或者 xiaohong
/xiaobai|xiaohong/g
#使用选择匹配符 | 来表达选择性质的需求
需求:捕获小写字母a或b或c
/[abc]/g
或
/a|b|c/g
3.2、选择匹配符结合子表达式
需求:匹配 hellophp
或 hellojava
p1:查什么=hello,查多少=1个,在哪查=任意
p2:查什么=php或java,查多少=1个,在哪查=紧跟
/hello(php|java)/gi
4、预查
4.1、正向预查
需求:匹配在php左边3个数字,123php,456php
正向预查语法:(?=要前瞻的字符)
p1:查什么=数字,查多少=3个,在哪查=任意
p2:查什么=是php预兆,查多少=1个,在哪查=紧跟
/\d{3}(?=php)/g
4.2、正向预查取反
需求:匹配不在php左边3个数字
正向预付取反语法:(?!要匹配的字符)
p1:查什么=数字,查多少=3个,在哪查=任意
p2:查什么=不是php预兆,查多少=1个,在哪查=紧跟
/\d{3}(?!php)/g
4.3、预查捕获
需求:捕获php左边的三位数字,并且把php本身也捕获出来
预查捕获:(?:要预查的字符)
/\d{3}(?:php)/g
4.4、选择性预查
需求:捕获php或者java左边的3位数字
p1:查什么=数字,查多少=3个,在哪查=任意
p2:查什么=php或java,查多少=1个,在哪查=紧跟
/\d{3}(?=php|java)/g
4.5、多条件预查
-
需求:匹配一个含有小写字母a的字符串,
***a***
1
p1:查什么=任意字符,查多少=任意个,在哪查=任意
p2:查什么=a,查多少=1个,在哪查=紧跟
p3:查什么=任意字符,查多少=任意个,在哪查=紧跟
/.*a.*/
2
p1:查什么=任意字符,查多少=任意个,在哪查=任意
p2:查什么=a出现的预兆,查多少=1个,在哪查=紧跟
p3:查什么=任意字符,查多少=任意个,在哪查=紧跟
/.*(?=a).*/
-
需求:匹配一个含有php的字符串,
***php***
p1:查什么=***php出现的预兆,查多少=1个,在哪查=任意
p2:查什么=任意字符,查多少=任意个,在哪查=紧跟
/(?=^.*php).*/
-
需求:密码验证,要求密码中必须包含大写字母、小写字母、数字,
**A**b**1**
p1:查什么=大写字母出现的预兆,
(?=.*[A-Z])
p2:查什么=小写字母出现的预兆,
(?=.*[a-z])
p3:查什么=数字出现的预兆,
(?=.*\d)
/(?=.*[A-Z])(?=.*[a-z])(?=.*\d)/