【前端32_高级】正则表达式:元字符、断言、匹配模式

正则

为什么要学正则,正则这东西可真的太神奇了,可以把字符串弄得服服帖帖的,不然你跟字符串相处就不是那么亲昵 hhhh


参考

开课吧的网课~这里是个整理


入门:提取数字

给你一串字符串 123jkh123hjk213h213jk43bmnb,请把这里的数字提取出来

第一种方法,写个函数

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);

判断字符串中是不是数字可以用isNaN()

第二种方式:正则

let reg = /\d+/g;
let arr = str.match(reg);
console.log(arr);

详解

创建正则

  • 字面量
  • 构造函数
let str = "dsajlkjrwlj";
let regExp1 = /\d+/g;						// 字面量创建正则
let regExp2 = new RegExp("\\d+","g")		// 构造函数创建正则,第二个参数是匹配模式

跟正则相关的字符串方法

split
let str = "babbabbbabbbb";
let arr = str.split(/a/);
console.log(arr);	// (4) ["b", "bb", "bbb", "bbbb"]
replace
let str = "abcd1234";
let reg = /\d+/g;
let res = str.replace(reg,"*");
console.log(res);   // abcd*

可以用来做敏感词过滤,可以看下一个例子

let str = "澳门赌场,真人发牌,av女优";
// 教育部 、 人员;
let reg = /赌场|av|女优/g;
// let res = str.replace(reg,"*");
let res = str.replace(reg,function(arg){
    // 回调函数中能够拿到匹配到的结果
    str.replace(reg,"*");
    return "*".repeat(arg.length);
})
console.log(res);   // 澳门**,真人发牌,****
match
let str = "abcd1234";
let reg1 = /\d+/g; 
let reg2 = /\d+/; 
// 如果不是全局匹配的话,他会拿到很多详细的
let res1 = str.match(reg1);
let res2 = str.match(reg2);
console.log(res1);   // ["1234"]
console.log(res2);   // ["1234", index: 4, input: "abcd1234", groups: undefined]
search

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

元字符

啥叫元字符呢?

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

下面会一一介绍每个元字符的作用

. 除了 \n \r \u2028\u2029 以外的所有字符

\ 转义:将特殊含义转换成字面量含义

* 出现零次或多次

^ 开头、$结尾、\w 字母、数字、下划线

// let str = "cde__111fg";
let str = "cde__111f";      // 测试的话改这里
// let reg = /^c\w+g$/g;
let reg = /^c\w+g$/g;
// let res = reg.test(str);
let res = str.match(reg);
console.log(res);

[] 字符集合

let str = "dffdabfds123fdabfdb435afdsa";
// let reg = /a|b/g;
let reg = /[ab]/g;      
let reg = /[^ab]/g; // 尖括号写在集合里面,就是取反的意思      
let res = str.replace(reg,"*");
console.log(res);
// 以下两个意思相同
let reg1 = /\d+/g;
let reg2 = /[0-9]+/g;
// 多种方式
// . === [^\r\n]
// \d === [0-9];
// \w === [a-zA-Z_0-9];

\b 边界:非 \w 都被称为边界;

// 想要匹配 前面的is ,而不是 this 中的 is
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);

$反向引用:根据分组

// 转换时间格式:2019-10-19  ---->  19/10/2019;
// 反向引用;
let mytime = "2019-10-19";
let reg = /(\d{4})-(\d{1,2})-(\d{1,2})/g;
let reg1 = /(\D+)/g;
let res = mytime.replace(reg,"$3/$2/$1");       // 正则里的东西,拿过来引用,通过分组
console.log( RegExp.$1 );                       // 2019

let res1 = mytime.replace(reg1,"-");            // 
console.log( RegExp.$1 );                       // -        
console.log(res);                               // 通过 RegExp 反向引用是有顺序的,应该是保留最后一次用正则的结果

命名分组:?<分组名> ES2018 新增特性

let str = "$name=zhangsan&age=20";
let reg = /\$(?<str>\w+)/;
let res = str.match(reg);
console.log(res.groups.str);

零宽断言

这是 ES2018 也就是 ES9 的语法。

我理解的啊

所谓的正向反向是针对 断言 的,(断言的意思就是猜测,不确定的东西。比方说 iphone6iphone7 等等,这些数字就是需要猜测的)

正向断言就是:猜后面,改前面
反向断言就是:猜前面,改后面

正向肯定断言

分组之后 (?=)

let str = "iphone3iphone4iphone11iphoneNumber";
// iphone 换成“苹果”;
// 匹配的条件是 iphone 后面必须接 一到两个 数字
let reg = /iphone(?=\d{1,2})/g;
let res = str.replace(reg,"苹果");
console.log(res);       // 苹果3苹果4苹果11iphoneNumber
正向否定断言

(?!)

let str = "iphone3iphone4iphone11iphoneNumber";
// iphone 换成“苹果”;
let reg = /iphone(?!\d{1,2})/g;
let res = str.replace(reg,"苹果");
console.log(res);   // iphone3iphone4iphone11苹果Number
负向肯定断言

(?<=)

// let str = "10px20px30pxipx";
// // px-->像素;
// let reg =  /(?<=\d{2})px/g;
// let res = str.replace(reg,"像素");
// console.log(res);   // 10像素20像素30像素ipx
负向否定断言

(?<!)

// 负向否定断言;猜前面,改后面
let str = "10px20px30pxipx";
// px-->像素;
let reg =  /(?<!\d{2})px/g;
let res = str.replace(reg,"像素");
console.log(res);       // 10px20px30pxi像素

匹配模式

// 匹配模式
// g:全局匹配
// i:忽略大小写;
let str = "aaaaaAAAAAA";
let reg = /a/g;
let reg1 = /a/gi;
let res = str.replace(reg,"*");
let res1 = str.replace(reg1,"*");
console.log(res);   // *****AAAAAA
console.log(res1);  // ***********

m 多行匹配

let str = `aaaaa
aaaaa`;
let reg1 = /^\w/g;
let reg2 = /^\w/gm;
let res1 = str.replace(reg1,"*");
let res2 = str.replace(reg2,"*");
console.log(res1);  
/* *aaaa
    aaaaa */

console.log(res2);
/*  *aaaa
    *aaaa */

s 可以让 . 匹配到换行符

let str = `<div>som
    e value..</div>`;
let reg1 = /<div>.*<\/div>/g;
let reg2 = /<div>.*<\/div>/gs;
// “\” 转义:将特殊含义转换成字面量含义;
let res1 = reg1.test(str);
let res2 = reg2.test(str);
console.log(res1);      // false
console.log(res2);      // true

u

// `\uD842\uDFB7` 是 汉字 𠮷
console.log(/^.$/.test("\uD842\uDFB7"));     // false
console.log(/^.$/u.test("\uD842\uDFB7"));    // true

y 粘性模式,只匹配第一个,之后的就匹配不到了。

let str = "12ab34cd";
let reg1 = /\d+/g;
let reg2 = /\d+/gy;
console.log(reg1.exec(str));    // ["12", index: 0, input: "12ab34cd", groups: undefined]
console.log(reg1.exec(str));    // ["34", index: 4, input: "12ab34cd", groups: undefined]

console.log(reg2.exec(str));    // ["12", index: 0, input: "12ab34cd", groups: undefined]
console.log(reg2.exec(str));    // null

都滑倒底了,如果对你有帮助的话,点个赞再走吧~在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值