正则表达式

##正则表达式(Regular Expression)

​ 1)正则的创建

​ 2)正则的匹配方法

​ 3)元字符

​ 4)字符集合

​ 5)边界

​ 6)分组

7)反向引用

​ 8)数量词汇

​ 9)匹配模式

-----

### 正则的创建

- 字面量创建

 let str = "abc1231dfaf123213fda";
    let reg = /abc/g;
    let res = str.match(reg);
    console.log(res);

 正则表达式会默认为字符串

    let str = "1231dfaf123213fda";
    let abc = "1231"
    let reg = /abc/g;
    let res = str.match(reg);
    console.log(res);


- 通过构造函数

 let str = "abc1231dfaf123213fda";
    let abc = "1231";
    let reg = new RegExp(abc,"g");
    let res = str.match(reg);
    console.log(res);
特殊字符需要转义
    let reg = new RegExp("\d+","g");
 

### 正则的匹配方法

字符串方法

- match  

- replace  替换

  let str = "abc11defghiej222k";
  let reg = /d/g;
  // console.log( str.replace(reg,"*") );

  let res =  str.replace(reg,function(arg){
      console.log(arg)
      return "*"
  })
  console.log(res);

- search  返回全局匹配 ,始终返回 第一个找到的索引值,如果找不到返回-1 (indexOf)  

  let str = "abcdefghiejk";
  let reg = /e/g;
  let reg = /e/;
  console.log( str.search(reg) );

- split  字符串分割 返回分割后的数组 可以通过正则分割也可以不通过

  let str = "abc123fda1234rt";
  let arr1 =  str.split(1); 
  let arr =  str.split(/d+/);  
  console.log(arr1)  ["abc", "23fda", "234rt"]
  console.log(arr)   ["abc", "fda", "rt"]

正则对象下的方法

- test  返回布尔值
- exec 基于上次匹配的结果,进行匹配

### 元字符

正则表达式中有特殊含义的非字母字符;

​ 1.字符类别(Character Classes)

  w W d D s S .

   ---- w :数字、字母、下划线;
    let str = "~123fdfs";
    let reg = /w+/g;
    console.log( reg.test(str));

   ---- W :非数字、字母、下划线;
     let str = "123fdfs";
     let reg = /W+/g;
        console.log( reg.test(str));
 
  ---- s :匹配空格;包括空格、制表符、换页符、换行符和其他 Unicode 空格
    let str = "abcfdsadfs";
    let reg = /s+/g;
    let reg = /S+/g;
    console.log( reg.test(str));

   ---- . : 非     u2028 u2029; 匹配行结束符( u2028 或 u2029)以外的任意单个字符
     let str = " ";
    let str = `afb`
    let reg = /a.b/;
    console.log( reg.test(str));
 

 2.数量相关

   {} ? + *;

   -----{}

    let str = "abceeeeeeeeeeeffd";
    let reg = /ce{3}f/g;
    let reg = /ce{1,4}f/g;  //从1次到4 可以看作一个闭区间
    let reg = /ce{1,}f/g    //至少出现一次
      console.log( reg.test(str) );

  -----? =====> {0,1} 
    let str = "123456789";
    let reg = /d{2,4}/g;     //会以4 最大值匹配  ---》贪婪匹配
    let reg = /d{2,4}?/g;   // 会以2最小值值匹配  ---》惰性匹配;
    let res =  str.match(reg);
    console.log(res)
       ----- + =====> {1,} 
    let str = "my name is lilei";
     let reg = /mys+name/g;
    console.log( reg.test(str));
  ------* =====> {0,};
 

 3.位置相关

   ^  $    B;
     let str = "abedef";
     let reg =/^w/g;
     let res =  str.replace(reg,"*");
     console.log(res);

    let str = "abedef";
    let reg =/w$/g;
    let res =  str.replace(reg,"*");
    console.log(res);

   ------:边界符; 边界: 非w 的 都是边界;
    // let str = "this is a book";
    // let reg = /is/g;
    // let res =  str.match(reg);
    // console.log(res);

  -----B 非边界;
    let str = "this is a book";
    let reg = /Bw{2}/g;
    let res =  str.match(reg);
    console.log(res);

 4.括号相关

   ()  []  {};
   -- ()
    -----分组;
     let str = "abababfdsafds";
     let reg = /(ab){3}/g;
     console.log(reg.test(str));

    ------提取值;
     let str = "2020-01-02";
     let reg = /(d{4})-(d{2})-(d{2})/;
     str.match(reg)
     console.log(RegExp.$1)
     console.log(RegExp.$2)
     console.log(RegExp.$3)

    -----替换;
     let str = "2020-01-02"; // 01/02/2020
     let reg = /(d{4})-(d{2})-(d{2})/;
    //let res =  str.replace(reg,"$2/$3/$1");
    let res =  str.replace(reg,function(arg,year,mouth,date){
         return mouth +"/" + date + "/" +year;
    });
     console.log(res)

    ------反向引用;
    let className = "news-container-nav"; //news_container_nav
    let reg = /w{4}(-|_)w{9}(1)w{3}/;
    let res =  reg.test(className);
    console.log(res);


    -- []:字符集合;
    let str = "My name is LiL1ei";
    /// let reg = /Li[Ll]ei/g;
    // // [a-z] [A-Z];  [a-Z]
    // // let reg = /[0-9]/g;
    // // console.log( reg.test(str));
    // let reg = /[^0-9]/g;
    // console.log( reg.test(str));
    // d [0-9]; w [a-zA-Z0-9_];
 
  --命名分组;
     let str = "2020-01-06";
     let reg = /(?<year>d{4})-(?<month>d{2})-(?<day>d{2})/;
     console.log( str.match(reg));


  -- 零宽断言;
    -----正向零宽断言;
    let str = "iphone3iphone4iphone5iphonenumber";
 
      -----正向零宽断言--> 肯定
     // let reg = /iphone(?=d)/g;
     -----正向零宽断言-->否定
    // let reg = /iphone(?!d)/g;
    // let res = str.replace(reg,"苹果");
    // console.log(res);

     -----负向零宽断言;
    let str = '10px20px30pxipx';
       ------负向零宽断言-->肯定
      // let reg = /(?<=d+)px/g;
      ------负向零宽断言--> 否定
      let reg = /(?<!d+)px/g;
      let res =  str.replace(reg,"像素");
      console.log(res);

### 字符集合

[xyz]

- 一个字符集合,也叫字符组。匹配集合中的任意一个字符。你可以使用连字符'-'指定一个范围
- `[xyz]` 是一个反义或补充字符集,也叫反义字符组。也就是说,它匹配任意不在括号内的字符。你也可以通过使用连字符 '-' 指定一个范围内的字符

### 边界

- ^
- 匹配输入开始。如果多行(multiline)标志被设为 true,该字符也会匹配一个断行(line break)符后的开始处
- $
- 匹配输入结尾。如果多行(multiline)标志被设为 true,该字符也会匹配一个断行(line break)符的前的结尾处
- 
- 匹配一个零宽单词边界(zero-width word boundary)
- B
- 匹配一个非零宽单词边界(zero-width word boundary)

###分组

- (子项)

- 可以使用 () 对表达式进行分组,类似数学中分组,也称为子项
- 索引分组
- 命名分组
- (?<name>...)
- groups属性
- 捕获匹配
- 具有捕获(capturing)特性,即会把匹配结果保存到(子项结果)中
- (x)
- 非捕获匹配
- 不具有捕获(capturing)特性,即不会把匹配结果保存到(子项结果)中
- (?:x)
- 零宽断言/预查(Assertions)
- 用于指定查找在某些内容(但并不包括这些内容)之前或之后的内容
- 正向零宽断言/预查
- 肯定
- (?=pattern)
- 否定
- (?!pattern)
- 负向零宽断言/预查(注意:ES2018新增)
- 肯定
- (?<=pattern)
- 否定
- (?<!patten)
- 捕获与零宽断言的区别
- 捕获:匹配的内容出现在结果中但不出现在子项结果中
- 零宽断言:完全不会出现在结果

### 反向引用

-
- 这里的 n 表示的是一个变量,值为一个数字,指向正则表达式中第 n 个括号(从左开始数)中匹配的子字符串

### 数量词汇

- x{n}
- n 是一个正整数。前面的模式 x 连续出现 n 次时匹配
- x{n,m}
- n 和 m 为正整数。前面的模式 x 连续出现至少 n 次,至多 m 次时匹配
- x{n,}
- n 是一个正整数。前面的模式 x 连续出现至少 n 次时匹配
- x*
- 匹配前面的模式 x 0 或多次
- x+
- 匹配前面的模式 x 1 或多次。等价于 {1,}
- x?
- 匹配前面的模式 x 0 或 1 次
- x|y
- 匹配 x 或 y

### 匹配模式

- g

- global,全局模式:找到所有匹配,而不是在第一个匹配后停止
- i

- ignore,忽略大小写模式:匹配不区分大小写
- m

- multiple,多行模式:将开始和结束字符(^和$)视为在多行上工作,而不只是匹配整个输入字符串的最开始和最末尾处
- s

- dotAll / singleline模式:. 可以匹配换行符
- u

- unicode,unicode模式:匹配unicode字符集

```js
console.log(/^.$/.test("uD842uDFB7"));
console.log(/^.$/u.test("uD842uDFB7"));
```
- y

- sticky,粘性模式:匹配正则中lastIndex属性指定位置的字符,并且如果没有匹配也不尝试从任何后续的索引中进行匹配

- 正则工具 http://regexper.com



原文地址:https://www.cnblogs.com/x-yy/p/12906773.html