二、js正则第 2 部分


11、i与g模式修正符

// g:全局匹配
// i:不区分大小写

let hd = 'wujUnjie';
console.log(hd.match(/u/gi))

// 实现字符替换
console.log(hd.replace(/u/gi,'@'))

12、多行匹配修正符

// m:多行文本可以都做单行处理,每一行每一行的处理
let hd = `
    #1 js,200元 #
    #2 php,300元 #
    #9 false.com # 吴俊杰
    #3 node.js,180元 #`;
console.log(hd.match(/#\d+\s+.+#$/gm))

// 注意这里m是单行处理

let obj = hd.match(/#\d+\s+.+#$/gm).map(v => {
  v = v.replace(/#\d+\s+/,'').replace(/\s*#/,'');
  [name,price] = v.split(',');
  return {name, price};
})
console.log(obj)

13、汉字与字符属性

// \p{L}:所有字母
// \p{N}:所有数字,类似于 \d 
// [\p{N}\p{L}]:所有数字和所有字母,类似于 \w 
// \P{L}:不是字母,等价于 [^\p{L}]
// \P{N}:不是数字,等价于 [^\p{N}]
// \p{P}:匹配所有标点符号

// 注意一般搭配g和u使用
let junjie = '!wu你junj好ie,. 20污1军0姐;';
console.log(junjie.match(/\p{P}/gu))
// 匹配所有中文
console.log(junjie.match(/\p{sc=Han}/gu))

// u模式:匹配内容按 utf-8 处理,可以用来匹配 utf-8 的中文字符,u模式可以匹配字节不等的所有字符

14、lastIndex属性的作用

let wu = 'wujunjie 2010';
// 保留全局匹配时的属性
let reg = /\w/g;
/* console.log(reg.lastIndex);
    console.log(reg.exec(wu));
    console.log(reg.lastIndex);
    console.log(reg.exec(wu));
    console.log(reg.lastIndex);
    console.log(reg.exec(wu));
    console.log(reg.lastIndex);
    console.log(reg.exec(wu));
    console.log(reg.lastIndex);
    console.log(reg.exec(wu));
    console.log(reg.lastIndex);
    console.log(reg.exec(wu));
    console.log(reg.lastIndex);
 */
// 利用lastindex属性实现循环匹配,这样能保留每个字符的信息
// lastindex只有配合g全局搜索时才会保留位置属性,没有配合g那么lastindex一直是0
while(res = reg.exec(wu)) {
  console.log(res)
}

15、有效率的y模式

let wu = 'unjieu iju;,u.u';
let reg = /u/g
// 从头开始匹配匹配到不是u的直接停止,如果第一个字母就不是u,直接不匹配
let regy = /u/y
while(res = reg.exec(wu)) {
  console.log(res)
}

while(res = regy.exec(wu)) {
  console.log(res)
}

console.log(wu.match(/u/g))

let wuu = 'wunjieu iju;,u.u';
let regyy = /u/y;
// 可以手动更改匹配的起始位置索引
regyy.lastIndex = 1;
while(res = regyy.exec(wuu)) {
  console.log(res)
}

16、原子表基本使用

// 原子表里的的内容全是以或的形式匹配

let jie = 'wujunjie';
console.log(jie.match(/[eu]/g));

let tel = '2022-03/23';
let reg = /^\d{4}[-\/]\d{2}[-\/]\d{2}/;
console.log(tel.match(reg));

// 这里有另一种写法,下面的\1对应前面的原子组,并且限制了前后内容一致
let tel1 = '2022-03-23';
let reg1 = /^\d{4}([-\/])\d{2}\1\d{2}/;
// 注意这两种结果的区别
console.log(tel1.match(reg1));
console.log(tel.match(reg1));

17、区间匹配

<input type="text" name="username">
  
// 区间匹配
let str = 'AAAwujunjie19960916BBByuanxiaorong00000';
console.log(str.match(/[a-z]+[0-9]+/g))

// 用户名匹配
let user = document.querySelector(`[name='username']`);
user.addEventListener('keyup',function() {
  console.log(this.value.match(/^[a-z]\w{3,6}$/i));
})

18、排除匹配

// 排除匹配:^放在原子表就是排除
let str = 'wujunjie19960916';
console.log(str.match(/[^ue]/gi));

// 两种匹配中文的方式
let newStr = `张三:010-999999,李四:020-8888888`;
console.log(newStr.match(/\p{sc=Han}+/gu));
console.log(newStr.match(/[^:\d\-,]+/g));

19、原子表字符不解析

// 那些不解析:()在原子表内外是完全不一样的,.在原子表内就是点,在原子表外带表除了换行符的所有字符
let str = '(wujunjie).fun';
console.log(str.match(/[.+]/gi));
console.log(str.match(/./gi));
console.log(str.match(/()/gi));
console.log(str.match(/[()]/gi));

20、使用原子表匹配所有内容

// 匹配所有内容\s指所有符号,包括换行,\S指除了\s
let str = `
    wujunjie
    19960916
    `;
console.log(str.match(/[\s]+/g));

文章作者: 吴俊杰
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 吴俊杰 !
 上一篇
三、js正则第 3 部分 三、js正则第 3 部分
因为AI的存在,导致js在正则并不是很重要,AI会给你一个完美的正则写法,当然你需要做到的就是能看懂,所以还是做些了解吧......
2024-12-03
下一篇 
一、js正则第 1 部分 一、js正则第 1 部分
因为AI的存在,导致js在正则并不是很重要,AI会给你一个完美的正则写法,当然你需要做到的就是能看懂,所以还是做些了解吧......
2024-12-03
  目录