正则

正则1

最初学正则的时候一笔带过没有认真学,导致每次想使用正则都是百度搜,最近重新学习了一下正则的语法,记录一下。

修饰符

i 忽略大小写

const reg = /a/i;
let r1 = reg.test("abc");
console.log(r1);    // true

let r2 = reg.test("ABC");
console.log(r2);    // true

g 全局匹配

类似 replaceAll,会匹配整个字符串中所有符合的

const reg2 = /ABC/g;
let r3 = '我ABC你ABC123ABC他ABC/*-'.replace(reg2, "abc");
console.log(r3);    // 我abc你abc123abc他abc/*-

元字符

\b 单词边界符

用来匹配单词(字母)的边界,当待匹配的字母两边不是字母的时候才会匹配。
例如,匹配情况: '    cat    ', '我cat你', '1cat2'
例如,不匹配情况: 'AcatB', 'acatb', ' cata', 'acat '
const reg1 = /\bcat\b/g;
const str1 = 'acatb cat123 cat ';
let s1 = str1.replace(reg1, 'dog');
console.log(s1);    // acatb cat123 dog 

^ $ 字符串边界符

^x 表示整个字符串以x开头
const reg2 = /^a/;
const str2_1 = 'abcdef';
const str2_2 = 'bacdef';
let s2_1 = reg2.test(str2_1);    // true
let s2_2 = reg2.test(str2_2);    // false
x$ 整个字符串以x结尾
const reg3 = /a$/;
const str3_1 = '123caxa';
const str3_2 = '123caax';
const s3_1 = reg3.test(str3_1);    // true
const s3_2 = reg3.test(str3_2);    // false
^x$ 表示精确匹配,必须整个字符串都是才可以
const reg4 = /^abcd$/;
const str4_1 = 'abcd';
const str4_2 = 'abcdXXabcd';
const s4_1 = reg4.test(str4_1);    // true
const s4_2 = reg4.test(str4_2);    // false

量词

* 表示0次或更多次
+ 表示1次或更多次
? 表示0次或1次
{x} 表示必须x次
{x,} 表示大于等于x次
{x,y} 表示大于等于x,小于等于y次
const reg2 = /^ab+c$/
const str2 = 'abbbbbbc';
let s2 = reg2.test(str2);    // true

const reg4 = /^ab{4}c$/
const str4 = 'abbbbc';
let s4 = reg4.test(str4);    // true

const reg6 = /^ab{4,6}c$/
const str6 = 'abbbbbbc';
let s6 = reg6.test(str6);    // true

[ ] 可选择项 

[ ] 匹配[ ]中任意一个
const reg1 = /[ABC]/g;
const str1 = 'AyuiyiuB78945C$%*ABC';
let s1 = str1.replace(reg1, '字母');
console.log(s1);    // 字母yuiyiu字母78945字母$%*字母字母字母

- 连字符

可使用 a-z A-Z 0-9 或中间截断

const reg2 = /[a-z]/g;  // [A-Z]大写
const str2 = '123uan/*iqmABC8odv';
let s2 = str2.replace(reg2, '字母');
console.log(s2);    // 123字母字母字母/*字母字母字母ABC8字母字母字母

匹配多个

const reg4 = /[a-zA-Z0-9_]/g;   // 常用的用户名合法检测
const str4 = 'q8w(*^&*989^1fAS4F*(&1a6dghf$%$UVuyG*)(^&$YG_xt';
let s4 = str4.replace(reg4, '他');
console.log(s4);    // 他他他(*^&*他他他^他他他他他他*(&他他他他他他他$%$他他他他他*)(^&$他他他他他

[^ ] 取反

除可选择项以外的

const reg5 = /[^0-9]/g;   // 除数字以外的
const str5 = 'G1dg32UT&gdT*14123fd121GTgdT*44fd&TG^%1424gf$^&G#%^gs*(464786135';
let s5 = str5.replace(reg5, '和');
console.log(s5);    // 和1和和32和和和和和和和14123和和121和和和和和和44和和和和和和和1424和和和和和和和和和和和和和464786135

. 除\r和\n以外的字符

注意,空字符串  '' 一样不会被匹配

const reg6 = /./g;
const str6 = ' a \nb1*\rQ';
let s6_1 = str6.replace(reg6, "空格");
let s6_2 = reg6.test("");
console.log(s6_1);    // 空格空格空格\n空格空格空格\r空格
console.log(s6_2);    // false

可选择项简写

\d => [0-9]  任意数字
\D => [^0-9] 除数字以外的
\w => [a-zA-Z0-9_]  任意字母数字下划线
\W => [^a-zA-Z0-9_] 除字母数字下划线以外的
\s => [\t\r\v\n\f]   任意换行空格制表符等
\S => [^\t\r\v\n\f]   任意换行空格制表符等

分组和分支结构

() 分组

就是常规理解的()的意思

const reg1 = /(ab)+/g;  // (ab)+  1个或1个以上的 ab
const str1 = 'ab12AB3ab*/-a/b7ab';
let s1 = str1.replace(reg1, "分组");
console.log(s1);    // 分组12AB3分组*/-a/b7分组
分组可进行捕获 捕获结果可用 $1 $2...表示,例如格式化日期:
const reg2 = /(\d{4})-(\d{2})-(\d{2})/;
const str2 = '日期为:2020-11-20';
let s2 = str2.replace(reg2, "$2/$3/$1");
console.log(s2);    // 日期为:11/20/2020

| 分支结构

类似或,可匹配多个项

const reg3 = /abc|123/g;
const str3 = '我是abc,你是123';
let s3 = str3.replace(reg3, "XXX");
console.log(s3);    // 我是XXX,你是XXX

 

posted @ 2023-06-11 22:32  邢韬  阅读(23)  评论(0编辑  收藏  举报