正则
正则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