正则表达式
Test 表示 检测
Exec 表示捕获
一: 基础元字符
\s 表示空格
\S 表示非空格
\t 制表符 tab符号
\d 数字字符 0-9
\D 非数字
\w 数字 字母 下划线 三者必须有一个
\W 非数字,字母,下划线以外的字符
. 表示除换行外 任意字符(除换行\n外,)
\ 表示转义符,没有意义变成有意义,有意义变成没有意义
例如
/./表示字符串里面必须含有一个除换行以外的字符
/ \./表示字符串里面需要一个.
/\\/ 表示一个反斜线文本
二: 边界元字符
^ 开始 $结束 (共计2个)
^ 字符串开始
1 /^\d/ 表示数字开始的字符串
2 $ 表示字符串结束
/\d$/ 表示数字结尾的字符串
/\^d$/: 表示一个字符,开始到只能有一个数字
三: 限定符
Ps: 都属于贪婪捕获: 尽可能多的捕获内容
写在普通元字符后面
修饰前面一个符号的次数(注意是前面一个)
1> * 表示出现0~多次
/\d*/ 表示字符串可以 出现0-n个数字
/^\d*$/ 表示开始到结束 都只能是数字 0-n个都可以
2> + 表示1~n次
/^\d+$/:表示字符串中的数字需要是1-n个
3> ? 表示出现0-1次 (有或没有)
表示千面修饰的元素项是可选的,可有可无
t1: \d{5}(-\d{4})? //代表(-\d{4}) 有没有都可以
t2: abc? /代表c可有可无,abc/ ab都可以
4> {n} 表示出现n次 (注意里面不能有空格)
例: /^\d{3}$/: 表示字符串中的数字是3个
5> {n,}表示n到多次
例: /^\d{3,}$/: 表示字符串中的数字是3个以上(包含3)
6> {n,m}表示个数是n~m个区间中
注意!!! 修饰的是前面一个字符
例:
/abcd{2}/ abcdd 符合
/(abcd){2}/ abcdabcd符合 abcd作为一个整体
四: 非贪婪捕获
非贪婪捕获: 尽可能少的捕获内容
*? 表示: 0-多次,获取0
+? 表示: 1到多次,获取1
?? 表示: 0-1次,获取0
{n}? 表示: n次,获取n
{n,}? 表示: n到多次,获取n
{n,m}? 表示: n-m次,获取n次
例 说的是捕获哈
/\d{3,}/ 捕获>=三个
/\d{3,}?/ 仅仅捕获三个
五: 特殊字符-(6个)
1> () 1.1 一个整体; 1.2单独捕获小分组
2> (?:) 整体匹配但是不捕获
3> | 占位 表示左边右边的都行,多和(|)出现
4> [] 表示内部任意一个都行(一个字符哈 )
5> [^] 占一个子字符位置,非里面的任意一个都行(一个字符哈)
6> - 中划线 表示到/至什么,配合[-]使用,([n-m]从n-m 确保ASCII连着的)
ps:()单独捕获介绍
const reg = /\d+\s+\d+/ 代表 (1-n个数字)+(1-n个数字空格)+(1-n个数字)
console.log(reg.exec('123 123'))
返回值: [0: '123' '123']
const reg = /\d+(\s)\d+/ 代表 (1-n个数字)+(1-n个数字空格)+(1-n个数字)
返回值: [0: '123' '123', 1 ' ' ] //数组中的1号把()的内容单独捕获出来
练习题
例题1 const reg = /^abc|def$/
表示已abc开头或者以def结尾都可以的
匹配abc 是ok的
例题2 const reg = /^ab(c|d)ef$/
表示 ab开头c/d中间都行ef结尾
例题3 /[abcd]/
表示字符串只能由一个字符组成,包含a/b/c/d任意字符就可以
例题4 /^[abcd]$/ 表示字符串只能为一个字符可以是四个中的任意一个字符
/^[^abcd]$/ 字符串中不能包含四个中的任意字符
例题5/^[^abcd]$/
表示字符传只能有一个字符组成,不能是abcd中的任意一个字符
常见组合形式
/^[0-9]$/ 表示一个字符, 0-9 任意一位数字字符 等价于\d
/^[^0-9]$/ 表示一个字符, 非0-9 任意一位数字字符 等价于\D
/^[a-z]$/ 表示一个字符, a-z任意一位字母字符
/^[0-9a-zA-Z_]$/ 表示一个字符, 字母数字下划线任意一位字符 等 价于\w
/^[^0-9a-zA-Z_]$/ 表示一个字符, 非(字母,数字和下划线)任意一位字符 等 价于\W
/[ ]/ 表示一个字符,空格 等价于\s
/[^ ] 表示一个字符,非空格 等价于\S
ps: 注意.在[.] [^.]内只代表”.”文本,不代表元字符的意义(即非换行的任意字符)
/^[abc.]$/ //代表一个字符,a或b或c或.四个字符任意一个
测试题
/^[0-9a-zA-Z]{1}[0-9a-zA-Z_] {5-11}$/
/^[0-9a-zA-Z]\w {5-11}$/
六: 正则表达式的预查/断言
正向预查
正向肯定预查 (?=)
当我捕获一个内容的时候,后面必须跟着的是我选择的
正向否定预查( ?!)
当我捕获一个内容的时候,后面必须不是跟着的是我选择的
负向预查
负向肯定预查 (?<=)
当我捕获一个内容的时候,前面必须跟着的是我选择的
负向否定预查 (?
七: 重复出现
\num
\1 表示重复出现第一个()一模一样的内容
ps:这货捕获用的
/(abc|def)\d+\1/
abc123abc Yes
abc123def NO
/([abcd])\d+([abcd])\d+\1\2/
a1234b1234ab 符合规则
Ps :注意 a和第一个小括号的元素一样
b和第二个小括号元素一样
?:用法:整体匹配但不捕获
/(?:[abcd])\d+([abcd])\d+\1/
a1234b1234b yes
a1234b1234a no
ps:由于(?:[abcd]) 不捕获,so第一位应该捕获是([abcd])中的b
八: 练习题
1 邮箱
/^[a-zA-Z0-9]\w{5,7}@(qq|sina|163)\.(com|cn)$/
/^[a-zA-Z0-9][a-zA-Z0-9_]{5,7}@(qq|sina|163)(.com|.cn)$/
2 抓手机号号段
/^(?:\+86)?(133|152)\d{8}$/
?: 匹配不捕获
? +86可能没有
九: 标识符
1 写在正则表达式的外面
2 用来修饰整个正则表达式
1> i 忽略大小写
2> g 全局
3> y 粘性全局
PS: 写在后面 吊吊吊
i 用法
/^[abcd]*$/ :abcd任意字符出现 0次或者多次
/^[abcd]*$/ i abcd/ABCD任意字符出现 0次或者多次
g 用法 全局
捕获用的 捕获全局的
str = abc123abc123abc123
exec(/\d{3}/) 仅仅捕获123
exec(/\d{3}/g) 仅仅捕获123 123 123 全局的123都能捕获出来
y 用法 粘性全局
str = abc123abc123abc123
exec(/\d{3}/y) null
str = 123abc456abc123
exec(/\d{3}/y) 123
exec(/\d{3}/y) null
str = 123456abc123
exec(/\d{3}/y) 123
exec(/\d{3}/y) 456
Ps: 第一次就需要连续数字,第二次接第一次连续必须也是数字 仔细体会
十: 创建正则表达式??
练习1 > 6-12位字符串仅为字母数字和下划线,且下划线不能出现在首位
/^[0-9a-zA-Z]\w{5,11}$/
练习2 > 字符串仅为数字(+:1-n次的纯数字)
/\d+/
练习3 > 字符串仅为字母(大小写字母)
/[a-z]+/I