正则
于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)); | true | a1中的1是数字,所以输出true |
D | 匹配非数字 | |||
w | 匹配字母、数字、下划线 | const p = /w/; const t = 'abc1 234_'; console.log(p.test(t)); | true | t变量即使有空格,但是t变量整体是有数字,字母,下划线,所以还是返回true |
W | 匹配非字母、数字、下划线 | |||
s | 匹配空白字符、空格、制表符、换行符 | const p = /s/; const t = 'a bc'; console.log(p.test(t)); | true | t变量存在空格 |
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)); | false | t变量中的b出现了2次,所以返回false |
* | 0个或者任意多 | 用法和?一样 | ||
+ | 至少1个 | 用法和?一样 | ||
[a-z] | 匹配a到z之间 | const p = /[a-z]/; const t = '2'; console.log(p.test(t)); | false | t变量的值不包含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)); | true | t变量不存在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(压缩字符串)