正则表达式

##正则表达式(Regular Expression)

课堂主题

​ 1)正则的创建

​ 2)正则的匹配方法

​ 3)元字符

​ 4)字符集合

​ 5)边界

​ 6)分组

7)反向引用

​ 8)数量词汇

​ 9)匹配模式


课堂目标

  • 理解正则中的基础知识
  • 理解正则中的各种概念
  • 会使用正则查找替换字符
  • 能使用正则在实际中运用

知识点

###字符串操作

  • 查找字符串中的数字;
  • 正则如何如实现

正则的创建

  • 字面量创建
  • 通过构造函数

正则的匹配方法

字符串方法

  • match
  • search
  • replace
  • split

正则对象下的方法

  • test
  • exec

元字符

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

​ 字符类别(Character Classes)

  • .
    • 匹配行结束符(\n \r \u2028 或 \u2029)以外的任意单个字符
    • 字符集合(Character Sets) 中,. 将失去其特殊含义,表示的是原始值
  • \
    • 转义符,它有两层含义
      • 表示下一个具有特殊含义的字符为字面值
        • 表示下一个字符具有特殊含义(转义后的结果是元字符内约定的)
  • \d 匹配任意一个阿拉伯数字的字符
  • \D 匹配任意一个非阿拉伯数字的字符
  • \w 匹配任意一个(字母、数字、下划线)的字符
  • \W 匹配任意一个非(字母、数字、下划线)的字符
  • \s 匹配一个空白符,包括空格、制表符、换页符、换行符和其他 Unicode 空格
  • \S 匹配一个非空白符
  • \t 匹配一个水平制表符(tab)
  • \r 匹配一个回车符(carriage return)
  • \n 匹配一个换行符(linefeed)
  • \v 匹配一个垂直制表符(vertical tab)
  • \f 匹配一个换页符(form-feed)

字符集合

[xyz]

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

边界

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

###分组

  • (子项)

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

    反向引用

    • \n
      • 这里的 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字符集

         console.log(/^.$/.test("\uD842\uDFB7"));
         console.log(/^.$/u.test("\uD842\uDFB7"));
        
    • y

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

总结

​ 1)正则的创建

​ 2)正则的匹配方法

​ 3)元字符

​ 4)字符集合

​ 5)边界

​ 6)分组

7)反向引用

​ 8)数量词汇

​ 9)匹配模式

正则表达式;["12312","2312"]
字符串里找到对应的数字;
let str = "fdsafd12312dfaf3443fds2312dafd1111";
方式一;
function getNumber(str){
    let arr = [];
    let temp = "";
    for(let i=0;i<str.length;i++){
        // console.log(typeof str[i]);
        if(!isNaN(str[i])){
            // console.log("数字");
            temp += str[i];
        }else{
            // console.log("非数字");
            if(temp!=""){
                arr.push(temp);
                temp = "";
            }
        }
    }
    if(temp!=""){
        arr.push(temp);
    }
    return arr;
}
let res = getNumber(str);
console.log(res);

正则实现;方式二; + 出现1次到多次; \d;数字;\D:非数字;
let reg = /\d+/g;
let arr = str.match(reg);
console.log(arr);

正则创建;
方式一:字面量创建;
let str = "fdsadf12313fdaf";
let a = "ad";
let reg = /a/;
let res = str.match(reg);
console.log(res);

创建方式二 :构造函数创建;
let str = "fdsadf12313fdaf";
let a = "ad";
let reg = new RegExp(a,"g");
let res = str.match(reg);
console.log(res);

正则方法;
1.test 2.exce;
let str = "dfasfd342234fda2342342f";
let reg = /\d+/;
let res = reg.test(str);
console.log(res);
let reg = /\d+/g;
let res = reg.exec(str);
console.log(res);
let res1 = reg.exec(str);
console.log(res1);


字符串方法;
1.split 2.replace; 3.search; 4.match;
1.split
let str = "fdafdafdsfdsafsddarer";
let arr = str.split(/a/);
console.log(arr);

2.replace;
let str = "fdafdaf1dsfdsa2fsdda33rer";
let reg = /\d+/g;
let res = str.replace(reg,"*");
console.log(res);
敏感词过滤;
let str = "据中国教育部数据显示,2007年至2018年,中国出国留学人数由14万增至66.2万,年均增长约14%;而同期的留学归国人数由4万增至51.9万,年均增长近24%。归国热潮下,海归就业的供需市场如何,成为留学人员与国内用人单位的共同关注。";
// 教育部 、 人员;
let reg = /教育部|人员/g;
// let res = str.replace(reg,"*");
let res = str.replace(reg,function(arg){
    return "*".repeat(arg.length);
})
console.log(res);

3.match;
let str = "fdsa1231dfaf232fda";
let reg = /\d+/g;
let res =  str.match(reg);
console.log(res);

4.search:匹配第一个符合结果的索引值位置;如果找不到 就返还-1;
忽略全部匹配;
let str = "fdsfda323fdaf1232";
let reg = /\d+/;
let res = str.search(reg);
console.log(res);

元字符:正则中有特殊含义的非字母字符;
. *(0次或者多次) + ? $ ^ | \ () [] {};

.  匹配除了 \n \r \u2028 或 \u2029  以外的所有字符;
let str = `
some
value..
`
; let reg = /
.*<\/div>/g; // “\” 转义:将特殊含义转换成字面量含义; let res = reg.test(str); console.log(res); ^开头 $ 结尾; \w:数字 字母 下划线; let str = "cde__111fg"; let reg = /^c\w+g$/g; let res = reg.test(str); console.log(res); []:字符集合; let str = "dffdabfds123fdabfdb435afdsa"; let reg = /a|b/g; let reg = /[^ab]/g; let res = str.replace(reg,"*"); console.log(res); let reg = /\d+/g; let reg = /[0-9]+/g; let res = str.replace(reg,"*"); console.log(res); let reg = /[0-20]+/g; let res = str.replace(reg,"*"); console.log(res); let str = "this knife is 5cM"; let reg = /[kKCc]?[Mm]/; let res = str.replace(reg,"米"); console.log(res); . ===> [^\r\n]; \d===>[0-9]; \w ===>[a-zA-Z_0-9]; 边界符:\b : 非 \w 都被称为边界; let str = "is this a book?"; let reg = /\bis\b/g; let reg = new RegExp("\\bis\\b","g"); let arr = str.match(reg); console.log(arr); ():分组; let str = "abfdssafdsababljljabssfd"; ?---{0,1} + --- {1,} * ---{0,} {2}; let reg = /s{2}/g; let reg = /(ab){2}/g; //abb let res = str.replace(reg,"*"); console.log(res); let str = "My name is Lilei"; // LiLei替换成李雷; let reg = /Li(L|l)ei/g; let res = str.replace(reg,"李雷"); console.log(res); 转换时间格式:2019-10-19 ----> 19/10/2019; 反向引用; let mytime = "2019-10-19"; let reg = /(\d{4})-(\d{1,2})-(\d{1,2})/g; let res = mytime.replace(reg,"$3/$2/$1"); // console.log( RegExp.$1 ); console.log(res); 命名分组;?<分组名> ES2018新增特性; let str = "$name=zhangsan&age=20"; let reg = /\$(?\w+)/; let res = str.match(reg); console.log(res.groups.str); 零宽断言:正向(后面) 负向(前面) ---》 肯定断言、否定断言 ; es2018 正向肯定断言; let str = "iphone3iphone4iphone11iphoneNumber"; // iphone 换成“苹果”; let reg = /iphone(?=\d{1,2})/g; let res = str.replace(reg,"苹果"); console.log(res); 正向否定断言; let str = "iphone3iphone4iphone11iphoneNumber"; // iphone 换成“苹果”; let reg = /iphone(?!\d{1,2})/g; let res = str.replace(reg,"苹果"); console.log(res); 负向肯定断言; let str = "10px20px30pxipx"; // px-->像素; let reg = /(?<=\d{2})px/g; let res = str.replace(reg,"像素"); console.log(res); 负向否定断言; let str = "10px20px30pxipx"; // px-->像素; let reg = /(?; let res = str.replace(reg,"像素"); console.log(res); 匹配模式 g:全局匹配 i:忽略大小写; let str = "afdafdAdfafd"; let reg = /a/gi; let res = str.replace(reg,"*"); console.log(res); m多行模式 let str = `adfsf dfdsa`; let reg = /^\w/gm; let res = str.replace(reg,"*"); console.log(res); s . 可以匹配换行符 let str = `
som e value..
`
; let reg = /<div>.*<\/div>/gs; // “\” 转义:将特殊含义转换成字面量含义; let res = reg.test(str); console.log(res); console.log(/^.$/.test("\uD842\uDFB7")); console.log(/^.$/u.test("\uD842\uDFB7")); y 粘性模式; let str = "1234dfafd43243fdsdf"; let reg = /\d+/g; console.log(reg.exec(str)); console.log(reg.exec(str));

你可能感兴趣的:(reg)