导航


HTML

CSS

JavaScript

浏览器 & 网络

版本管理

框架

构建工具

TypeScript

性能优化

软实力

算法

UI、组件库

Node

冷门技能

转义符号 vs 转义字符

\n、\r、\t

RegExp (regular expression)

修饰符

i

var reg = new RegExp('Test', 'i'),
    str = 'This is a test';

console.log(reg.test(str)); // true
var reg = new RegExp('Test', 'i'),
    str = 'This is a test, Test is important';

console.log(str.match(reg));

Untitled

g

var reg = new RegExp('Test', 'ig'),
    str = 'This is a test, Test is important';

console.log(str.match(reg));

Untitled

以xxx开头 ^

var reg = new RegExp('^Test', 'ig'),
    str = 'This is a test, \\nTest is important';

console.log(str.match(reg)); // null

m

var reg = new RegExp('^Test', 'igm'),
    str = 'This is a test, \\nTest is important';

console.log(str.match(reg));

Untitled

正则字面量 vs new RegExp 对象

var v = 'Test';
var reg = /^v/igm;
var str = 'This is a test, \\nTest is important';
console.log(str.match(reg)); // null

Untitled

var v = 'Test';
var reg = new RegExp(v, 'igm');
var str = 'This is a test, \\nTest is important';
console.log(str.match(reg));

Untitled

表达式

[] 匹配一位

匹配 [] 中的一位,而不是多位

var str = '099asdianas812o3i1nasf';
// 匹配连续三个数字的,每个数字可以是0-9的任意数字
var reg = /[1234567890][1234567890][1234567890]/g;
console.log(str.match(reg));

Untitled

var str = '0997asdianas812o3i1nasf';
var reg = /[1234567890][1234567890][1234567890]/g;
console.log(str.match(reg));

还是 099、812,而不会 099、997、812。正则会匹配完 099 后,就跳过 099,直接从后边的7开始继续匹配

如果没匹配上,则不会跳过往下,例如 s81没匹配上,后续就会从 812 往后匹配

Untitled

var reg = /[wx][xy][z]/g, // wx中其中一个,xy其中一个,z
    str = 'wxyz';
console.log(str.match(reg));

上边的意思是,连续的三位(因为有三个[]),每个[]中的字符是可选字符

Untitled

- 区间

var str = 'asdiand3wkansf(SGSknasflSKv012Svsa',
    reg = /[0-9][A-Z][a-z]/;
// 匹配第一个字符0-9,第二个字符是大写任意字母,第三个字符是小写任意字母
console.log(str.match(reg));

Untitled

var str = 'aAaasdiand3wkansf(SGSknasflSKv012Svsa',
    reg = /[0-9A-Za-z][A-Z][a-z]/;
// 匹配第一个字符是数字或者大小写字母
// 第二个字符是大写任意字母
// 第三个字符是小写任意字母
console.log(str.match(reg));

Untitled

var str = 'AAaasdiand3wkansf(SGSknasflSKv012Svsa',
    reg = /[0-9A-z][A-Z][a-z]/;
// 匹配第一个字符是数字或者大小写字母
// 第二个字符是大写任意字母
// 第三个字符是小写任意字母
console.log(str.match(reg));

另一种简写 [A-z] 匹配大小写字母: ⚠️不严谨,A-z之间还存在一些字符,比如下边的 _ 也会匹配出来

var str = 'AAaasdiand3wkansf_(SGSknasflSKv012Svsa',
    reg = /[A-z]/g;
console.log(str.match(reg));

Untitled

所以最好还是写成 [a-zA-Z]

但是 [z-A] 不行:

var str = 'AAaasdiand3wkansf(SGSknasflSKv012Svsa',
    reg = /[0-9z-A][A-Z][a-z]/;
console.log(str.match(reg));

Untitled

因为 - 是按照 ACS 顺序的,不能反着来。

可用区间

⭐️ 表达式中写 ^ 表示非

[ ] 中写 ^ 表示非

var str = 'z0Aaasdiand3wkansf(SGSknasflSKv012Svsa',
    reg = /[0][A-Z][a-z]/;
console.log(str.match(reg));

Untitled

var str = 'z0Aaasdiand3wkansf(SGSknasflSKv012Svsa',
    reg = /[^0][A-Z][a-z]/;
console.log(str.match(reg));

Untitled

⭐️ | 或者

var str = '234asdiabgAS09Ss83sdk123c',
    reg = /123|234/g;
console.log(str.match(reg));

Untitled

var str = '234asdiabgAS09Ss83sdk123c',
    reg = /123|234[a-d]/g;
console.log(str.match(reg));

上边 reg 表示,匹配 123 或者 234 后边跟一位,可以是小写字母 a-d:

Untitled

如果想匹配 123 后边跟一位 a-d 的小写字母,或者 234 后边跟一位 a-d 的小写字母,就得用括号把 123|234 包起来:

Untitled

⭐️ 元字符

正则使用的转义字符

\w 和 \W

var reg = /\\Wab/g,
    str = '234abc-%&';
console.log(str.match(reg));

Untitled

var reg = /\\Wab/g,
    str = '234abc-%&';
console.log(str.match(reg));

Untitled

var reg = /\\Wab/g,
    str = '234%abc-%&';
console.log(str.match(reg));

Untitled

⭐️ \d 和 \D

var reg = /\\dab/g,
    str = '234abc-%&';
console.log(str.match(reg));

Untitled

var reg = /\\Dab/g,
    str = '234abc-%&';
console.log(str.match(reg));

Untitled

var reg = /\\Dab/g,
    str = '23eabc-%&';
console.log(str.match(reg));

Untitled