正则表达式

正则表达式_第1张图片
1498119150750748.jpg

正则表达式

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 

你可能感兴趣的:(正则表达式)