正则

2023-08-15 13:36:34发布
19

创建

const p = /tom/igm;

等价于

const p = new RegExp('tom', 'igm');

其中,igm代表:

参数含义
i忽略大小写
g全局匹配
m多行匹配


元字符

元字符含义例子运行结果分析
.匹配任意字符,除了换行符const p = /./;
const t = '
';
console.log(p.test(t));
false.是匹配任意字符,但是不包括换行符。t变量包含换行符,所以输出false
d匹配数字const p = /d/;
const t = 'a1';
console.log(p.test(t));
truea1中的1是数字,所以输出true
D匹配非数字
w匹配字母、数字、下划线const p = /w/;
const t = 'abc1 234_';
console.log(p.test(t));
truet变量即使有空格,但是t变量整体是有数字,字母,下划线,所以还是返回true
W匹配非字母、数字、下划线
s匹配空白字符、空格、制表符、换行符const p = /s/;
const t = 'a bc';
console.log(p.test(t));
truet变量存在空格
S匹配非空白字符、空格、制表符、换行符
^以特定的字符开头const p = /^d/;
const t = '1abc';
console.log(p.test(t));
true/^d/
该正则表示以数字开头
$以特定的字符结尾const p = /d$/;
const t = 'abc1';
console.log(p.test(t));
true/d$/
该正则表示以数字结尾
?匹配0个或者1个const p = /ab?cdefg/;
const t = 'abbcdefg';
console.log(p.test(t));
falset变量中的b出现了2次,所以返回false
*0个或者任意多用法和?一样
+至少1个用法和?一样
[a-z]匹配a到z之间const p = /[a-z]/;
const t = '2';
console.log(p.test(t));
falset变量的值不包含a到z之间的字符
[A-Z]匹配A到Z之间
[0-9]匹配0到9之间
[^0-9]匹配非0到9之间const p = /[^0-9]/;
const t = 'ab';
console.log(p.test(t));
truet变量不存在0到9之间的值,所以返回true
{m}必须要有m个const p = /a{2}b/;
const t = 'ab';
console.log(p.test(t));
false必须要有2个a
{m-n}匹配最少m个,最多n个const p = /a{1,2}b/;
const t = 'b';
console.log(p.test(t));
false至少要有1个字符a
|a|b|c匹配a或b或c中的一个const p = /com|cn/;
const t = 'www.baidu.com';
console.log(p.test(t));
true


分组

先看一个例子

const p = /tom{2,3}/;
const t = 'tomm';
console.log(p.test(t));

上面的例子是tom的m,必须出现2到3次,所以输出true。现在我要求om这2个字符,必须出现2到3次,那要怎么写呢? 这里就要用分组的概念了,如下

const p = /t(om){2,3}/;
const t = 'tomom';
console.log(p.test(t));

用括号括起来,就算一个组


获取模式中分组对应的匹配字符串

例子1

const p = /t(om)/g;
const t = 'tom';
console.log(p.test(t));

上面的例子输出true,现在我想获取到匹配到的分组om,则可以这样写

const p = /t(om)/g;
const t = 'tom';
console.log(p.test(t)); // 调用RegExp.$1必须要运行一下test方法
console.log(RegExp.$1); // 获取模式中第一个分组对应的匹配字符串

tips :若需要取得第二个、第三个......分组,则:RegExp.$2、RegExp.$3......


例子2 (匹配的字符加红)

const p = /(name)/g;
const t = 'my name is tom, what your name ?';
document.write( t.replace(p, "<font style='color:red;'>$1</font>") );

需要转意的字符

const p = /w?/;
const t = 'a';
console.log(p.test(t));

输出true,但是实际上这不是我们想要的结果。上面的例子本来想要的结果是:任意字符 + ?。比如 abc?,但是因为?是元字符,这里需要转义一下,如下 :

const p = /w?/; // ?前面加了
const t = 'a?';
console.log(p.test(t));


正则案列

例子1 (把一行的代码分行)

输出


例子2(压缩字符串)