js知识梳理六

正则特殊元字符

  • \d 0~9之间的一个数字
  • \D 非0~9之间的任意字符
  • \w “数字、字母、下划线”中的任意一个 =>/[0-9a-zA-Z_]/等价于\w
  • \s 匹配任意一个空白字符(包括\t制表符[TAB键四个空格])
  • \b 匹配边界符 ‘zhu’(z左边和u右边就是边界) ‘zhu-feng’(z左边、u右边、f左边、g右边是边界)
  • \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次

普通元字符

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

中括号的一些细节

[xyz]   [^xyz]   [a-z]   [^a-z]

  • 1.中括号中出现的元字符一般都是代表本身含义的
    • 2.中括号中出现的两位数,不是两位数,而是两个数字中的任意一个
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      let reg = /^.+$/;//=>一个正则设置了^和$,那么代表的含义其实就是只能是xxx
      console.log(reg.test('n'));//=>true
      console.log(reg.test('1'));//=>true
      console.log(reg.test('nn'));//=>true
      console.log(reg.test('\n'));//=>false

      let reg = /^[.]+$/;
      console.log(reg.test('n'));//=>false
      console.log(reg.test('1'));//=>false
      console.log(reg.test('nn'));//=>false
      console.log(reg.test('\n'));//=>false
      console.log(reg.test('...'));//=>true

分组的作用

1.改变的默认的优先级

2.分组捕获

3.分组引用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 let reg = /^18|19$/;
console.log(reg.test('18'));//=>true
console.log(reg.test('19'));//=>true
console.log(reg.test('1819'));//=>true
console.log(reg.test('189'));//=>true
console.log(reg.test('181'));//=>true
console.log(reg.test('819'));//=>true
console.log(reg.test('119'));//=>true
-----------------------------------------
// 改变的默认的优先级
reg = /^(18|19)$/;
console.log(reg.test('18'));//=>true
console.log(reg.test('19'));//=>true
console.log(reg.test('1819'));//=>false
console.log(reg.test('189'));//=>false
console.log(reg.test('181'));//=>false
console.log(reg.test('819'));//=>false
console.log(reg.test('119'));//=>false
-----------------------------------------
let reg = /^([a-z])([a-z])\2\1$/;//=>正则中出现的\1代表和第一个分组出现一模一样的内容...
console.log(reg.test('oppo'));
console.log(reg.test('poop'));
------------------------------------------------
//=>编写一个正则匹配身份证号码
// let reg = /^\d{17}(\d|X)$/;//=>简单:只能匹配是否符合格式,不能提取出身份证中的一些信息
// '130828199012040617'
//=>130828 地域
//=>19901204 出生年月
//=>0617 倒数第二位:奇数=男 偶数=女

let reg = /^(\d{6})(\d{4})(\d{2})(\d{2})\d{2}(\d)(?:\d|X)$/;
console.log(reg.exec('130828199012040617'));//=>EXEC实现的是正则捕获,获取的结果是一个数组,如果不匹配获取的结果是null,捕获的时候不仅把大正则匹配的信息捕获到,而且每一个小分组中的内容也捕获到了(分组捕获) : ["130828199012040617", "130828", "1990", "12", "04", "1", index: 0, input: "130828199012040617"]

正则捕获使用的是正则中的EXEC方法

  • 1.如果可以匹配获取的结果是一个数组,如果不能匹配获取的结果是NULL
  • 2.如果我们只在匹配的时候,想要获取大正则中部分信息,我们可以把这部分使用小括号包起来,形成一个分组,这样在捕获的时候,不仅可以把大正匹配的信息捕获到,而且还单独的把小分组匹配的部分信息也捕获到了(分组捕获)
  • 3.有时候写小分组不是为了捕获信息,只是为了改变优先级或者进行分组引用,此时我们可以在分组的前面加上“?:”,代表只去匹配,但是不把这个分组内容捕获

常用正则表达式

有效数字

1
2
3
4
5
6
7
/*分析规则:
* 1.可以出现+/-号:可以没有,也可以有一个
* 2.整数 0 12 9 : 一位或者多位数字,一位0~9,多位数字不能以0开头
* 3.小数部分:可能有可能没有,有小数点后面至少要跟一位数字
/^[-+]?(\d|([1-9]\d+))(\.\d+)?$/
*/
let reg = /^[+-]?(\d|([1-9]\d+))(\.\d+)?$/;

电话(手机)号码

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

中文姓名

1
2
3
4
/*   1. 中文汉字  [\u4E00-\u9FA5]
* 2. 尼古拉斯·赵四
*/
let reg = /^[\u4E00-\u9FA5]{2,}(·[\u4E00-\u9FA5]{2,})?$/

邮箱

1
2
3
4
5
6
7
 /*   xxxx@xxx.xx.xx
*
* 第一部分:数字、字母、下划线、-、.,但是-和.不能作为开头,不能连续出现-或者.
*
* 第二部分:xxx.xx.xx xxx.xx xxx.xx.xx.xx xxx-xxx-xx.xx.xx
/
//=>/^\w+((-\w+)|(\.\w+))*@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/

-------------本文结束感谢您的阅读-------------