正则表达式解读

266 阅读3分钟

写在前面:这一篇总结正则表达式的一些知识,包含一些方法,各种元字符,以及特性的一些内容,希望能够给你一些帮助。

什么是正则?

规则表达式,书写一段规则,用于匹配一段字符串是否符合规则。

正则怎么创建?

1,字面量形式:const reg = /abc/;

2,内置构造函数:const reg1 = new RegExp('abc');会把'\w' 把 w 转化为以一个具有特殊含义的 字符, 所以这一步没有什么意义。

正则的常用方法:

1,匹配 正则.test(字符串);匹配字符串是否符合正在规则,符合返回true,不符合返回false;

const reg = /abc/   // 要求字符串中 包含 abc
const str = 'qwertyui';
const str1 = 'qwertyuiabc';
​
console.log(reg.test(str));  // false
console.log(reg.test(str1));  // true
console.log(reg.test('1234567890'));  // false

2,捕获 正则.exec(字符串);没有捕获到时返回一个 null;捕获到了:

1)没有小括号也没有g (标识符,下面提)的情况,永远捕获的都是下标0开始第一个符合条件的

const reg = /\d{3}/;
console.log(reg.exec('z123xc456vb789nm000'));
console.log(reg.exec('z123xc456vb789nm000'));
console.log(reg.exec('z123xc456vb789nm000'));//打印的都是123

2)没有小括号,但是又修饰符g的情况,第一次捕获完成后,下一次开始的起始位置是上一次结束位置,当所有匹配项都匹配完成后,会返回一个null;再次捕获时,就从下标0重新开始。

const reg = /\d{3}/g;
console.log(reg.exec('z123xc456vb789nm000'));    // 123
console.log(reg.exec('z123xc456vb789nm000'));   // 456
console.log(reg.exec('z123xc456vb789nm000'));   // 789
console.log(reg.exec('z123xc456vb789nm000'));   // 000
console.log(reg.exec('z123xc456vb789nm000'));   // null
console.log(reg.exec('z123xc456vb789nm000'));   // 123

3)有小括号,下标0还是我们正常捕获到的内容,从下标1开始,就是每个小括号捕获到的内容;

const reg = /(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/;
const str = '我的身份证号是 411371200411081234; 不信算了!!!';
console.log(reg.exec(str));
正则的元字符:
1,普通元字符:

\d 表示一个数据(0-9);

\D 表示一个 非数字(除了0-9);

\w 表示数字(0-9) 字母(a-zA-Z)下划线(_)其中一个;

\W 表示 除了 数字(0-9) 字母(a-zA-Z)下划线(_) 的 其中一个;

\s 表示一位空白字符;

\S 表示一位非空白字符;

. 表示一位 非换行的任意字符;

\ 表示转义符;(把有意义的符号转换为没意义的文本,把没意义的文本转换为有意义的符号)

2,边界元字符:

^ 表示开头;

$ 表示结尾;

const reg1 = /\d/;    // 表示字符串至少出现一个数字
const reg2 = /^\d/;   // 表示字符串开头是一个数字
const reg3 = /\d$/;    // 表示字符串结尾是一个数字
const reg4 = /^\d$/;    // 表示字符串只能是一个数字
3,限定元字符:( )括号不是语法,只是方便放元字符

( * ) 表示0~正无穷次;

( + ) 表示1~正无穷次;

( ? ) 表示0~1次;

{n} 表示 限定 n 次,不能多也不能少;

{n,} 表示 最少 n次;

{n , m} 表示最少 n 次,最多 m 次;

const reg1 = /^\d*$/  // 这个字符串的数字只能出现 0~正无穷次
console.log(reg1.test('1'))   // true
console.log(reg1.test('1a'))   // false
     
const reg2 = /^\d+$/ // 这个字符串的数字只能出现1~正无穷
console.log(reg2.test('100'))    // true
console.log(reg2.test('qwer'))    // false
console.log(reg2.test('999qwer'))    // falseconst reg3 = /^\d?$/ // 这个字符串的数字只能出现 0~1 次
console.log(reg3.test('666'))    // false
console.log(reg3.test('6'))    // trueconst reg4 = /^\d{2}$/   // 这个字符串的数字只能出现 2 次
console.log(reg4.test('666'))    // false
console.log(reg4.test('66'))    // true
console.log(reg4.test('6'))    // falseconst reg5 = /^\d{2,}$/   // 这个字符串的数字最少出现 2 次
console.log(reg5.test('666'))    // true
console.log(reg5.test('66'))    // true
console.log(reg5.test('6'))    // falseconst reg6 = /^\d{2,3}$/   // 这个字符串的数字最少出现 2 次 最多出现3次
console.log(reg6.test('6666'))    // false
console.log(reg6.test('666'))    // true
console.log(reg6.test('66'))    // true
console.log(reg6.test('6'))    // false
4,特殊元字符

( ) 含义1:当成一个整体; 含义2:单独捕获(在上面一点点正则方法中有说);

const reg = /(abc){2}/  // 表示 abc 这个整体 一定出现 2 次
console.log(reg.test('abcdef')) // false
console.log(reg.test('abcab')) // false
console.log(reg.test('abcabc')) // true

| 或 , 字符为 或 左右两边的都行;

const reg = /(abc|def){2}/  // 这个字符串需要 abc 或者 def 出现两次
console.log(reg.test('abcabc')) // true
console.log(reg.test('abcdef')) // true
console.log(reg.test('defabc')) // true
console.log(reg.test('defdef')) // true

[ ] 包含,[abcd] ,包含其中一个就可以,表示一位字符;

const reg = /^[a-c]$/   // 这个字符串只能是 a-c 其中的任意一个字符
console.log(reg.test('abc'))    // false
console.log(reg.test('a'))    // true
console.log(reg.test('b'))    // true
console.log(reg.test('c'))    // true
console.log(reg.test('@'))    // false

[^] 非,不能包含里面的内容;

const reg = /^[^a-c]$/  // 这个字符串只能是 a-c 之外的任意一个字符
console.log(reg.test('abc'))    // false
console.log(reg.test('a'))    // false
console.log(reg.test('b'))    // false
console.log(reg.test('c'))    // false
console.log(reg.test('@'))    // true

( - ) 到(至);上面的代码都有说,例如:[a-c],就是a到c,包含 a,b c;(括号不在语法内)

5,重复元字符

符号:\1 \2 …… \9(代表第几个小括号的值)

/(abc|def)\1/

小括号 内 为 abc \1 这个位置也需要是 abc;

小括号 内 为 def \1 这个位置也需要是 def;

const reg = /^(abc|def)\1$/ // 小括号内是什么 \1 的位置就应该是什么
console.log(reg.test('abcdef')) // false
console.log(reg.test('abcabc')) // true
console.log(reg.test('defabc')) // false
console.log(reg.test('defdef')) // true
6,正则标识符

i 忽略大小写;

const reg1 = /^[a-c]$/i // 忽略大小写
console.log(reg1.test('a'))  // true
console.log(reg1.test('A'))  // true

g 全局;(代码在上面捕获的位置有);

正则的两大特性:

1,懒惰:正常捕获字符串的时候,每次都从下标0开始,解决方法:给正则添加一个修饰符g;

2,贪婪:每次捕获时,尽可能的多捕获一些东西,解决:在原有修饰符后加一个 ? 然后相当于开启 非贪婪模式(能少拿就少拿);

const str = '<div class="box" id="box1"><span></span></div>'
const reg = /<div.*>/   // 贪婪模式
console.log(reg.exec(str))
​
const reg1 = /<div.*?>/ // 非贪婪模式
console.log(reg1.exec(str))