阅读 12

正则

正则表达式是由一个字符序列形成的搜索模式 正则:是一个用来处理字符串的规则

语法

/正则表达式主体/修饰符(可选)

  • 正则只能用来处理字符串
  • 处理一般包含两方面
    • A:验证当前字符串是否符合某个规则“正则匹配”
    • B:把一个字符串中符合规则的字符获取到“正则捕获”

接下来一起学习利用正则编写规则

每个正则都是由‘元字符’、‘修饰符’两部分组成 两个斜杠之间包起来的都是‘元字符’,斜杠后面出现的都是‘修饰符’

  • 常见修饰符
    • g global 全局匹配
    • m multiline 多行匹配
    • i ignoreCase 忽略大小写匹配
  • 常用元字符
    • 【特殊元字符】(nbswd)

      • \d 0~9之间的一个数字
      • \d+ 出现多个0~9之间的数字
      • \D 非0~9之间的任意字符
      • \w 数字、字母、下划线 中的任意一个[0-9a-zA-Z_]
      • \s 匹配任意一个空白字符(包括\t制表符[tab键四个空格])
      • \b 匹配边界符
        • 'zheng'(z左边和g右边就是边界)
        • 'zheng-ze'(z左边g右边,z左边e右边是边界)
      • \n 匹配一个换行符
      • \ 转义字符(把一个普通字符转义为特殊的字符,例如:\d,把有特殊含义的转换为普通意思的,例如:.此处的点就是一个小数点)
      • . 不仅仅是小数点,代表除了\n以外的任意字符
      • ^以某个元字符开头
      • $ 以某个元字符结尾
      • x|y x或者y中的任意一个(a|z...)
      • [xyz] x或者y或者z中的任意一个
      • [^xyz] 除了x、y、z以外的字符
      • [a-z] 获取a-z中的任意一个字符([0-9] 等价于\d...)
      • [^a-z] 除了a-z的任意字符
      • () 正则分组,只匹配不捕获
      • (?:) 当前分组只匹配不捕获
      • (?=) 正向预查
      • (?!) 负向预查
    • 【量词元字符:让其左边的元字符出现多少次】

      • *出现零到多次
      • ?出现零到一次
        • 出现一次到多次
      • {n}出现N次
      • {n,}出现N到多次
      • {n,m} 出现N到M次
    • 【普通元字符】

      • 只要在正则中出现的元字符(在基于字面方式创建),除了特殊和有量词意义的以外,其余的都是普通元字符

元字符‘[]’中括号的一些细节

  1. 在中括号中出现的元字符一般都是代表本身含义的
  2. 中括号中出现的两位数,不是两位数,而是两个数字中的任意一个
let reg = \^[18]$\
reg.test(18) //false
reg.test(1) // true
reg.test(8) // true
复制代码

元字符 ‘()’作用

  • 分组的作用
    • 1.改变默认的优先级
    • 2.分组捕获
    • 3.分组引用
let reg = /^18|19$/;
reg.test('18') //true
reg.test('19') //true
reg.test('1819') //true
reg.test('189') //true

复制代码

1.创建正则的两种方式

let reg1 = /^\d+$/g //=>字面量方式
//   ^\d+$ 这些属于元字符 g属于修饰符
let reg2 = new RegExp('^\\d+$','g'); //=>构造函数方式
复制代码

例子

let res = /^.$/;//=>一个正则同时设置^和$,那么代表的含义其实就是只能是xxx
res.test('n'); // true
res.test('1'); // true
res.test('\n'); //false
res.test('nn'); //false 只能是一位
复制代码

编写一个正则匹配身份证号

let reg = /^\d{}17(\d|X)$/;//=>简单:只能匹配是否符合格式,不能提取出神风筝中的一些信息
// 130444 地域
// 19991111 出生年月日
// 4344 倒数第二位:奇数=男 偶数=女
优化 let reg = /^(\d{6}(\d{4})/

复制代码

exec 正则捕获

  • 如果可以匹配获取的结果是一个数组,如果不能匹配获取的结果是null
  • 如果我们只在匹配的时候,获取正则的部分信息,可以把这部分使用小括号包起来,形成一个分组,这样在捕获时大正则和小分组匹配的部分同时捕获(分组捕获)
  • 有时候写小分组不是为了捕获信息,只是为了改变优先级或者进行分组引用,弱不想捕获可以在分组数据前加‘?:'

常用正则表达式

  • 有效数字

1.正数 负数 零 2.小数 整数 规则:可以出现 -正负号 +/-;可以没有,也可以有一个

  • 整数 0 12 9: 一位或者多位数字,一位0~9,多位数字不能以0开头
  • 小数部分:可能有可能没有,有小数点后面至少跟一位数字
  • 电话(手机)号码

1.11位数字 2.以1开头 let reg = /^1\d{10}$/

  • 中文姓名

1.中文汉字 [\u4E00-\u9FA5] let reg = /[1]{2,}(.[\u4E00-\u9FA5]{2,)$/;

  • 邮箱 xxx @xxx.xx.xx let reg = /^\w+((-\w+)|.\w+))@[A-Za-z0-9]+((.|-)[A-Za-z0-9]+).[A-Za-z0-9]$/

  1. \u4E00-\u9FA5 ↩︎