前言
regExp: regular expression:是一个js内置的类
- 专门用来处理字符串的
- 就是一个规则,用来检验字符串是否属于这个规则(test),也可以把符合规则的字符串捕获到(exec)
let reg = /\d+/; // 0-9之间的数字出现1到多次
console.log(reg.test('12')); // true
console.log(reg.test('d12fg')); // true
console.log(reg.exec('d12fg')); // [0:'12',......]
正则的组成
元字符
正则的元字符:量词元字符 特殊元字符 普通元字符
量词元字符:
*:0到多次
+:1到多次
?:出现0到1次
{n}:出现n次
{n,}:至少出现n次
{n,m}:出现n到m次
特殊元字符(带*的是常用的)
\:转义字符,把普通的元字符转化为特殊的元字符,还可以把特殊的元字符转化为普通的元字符
.:任意字符(除了换行符)
^:以什么什么开头 *
$:以什么什么结尾 *
\n:换行符
\d:0-9之间的任意数字 *
\D:非0-9之间的任意数字
\w:数字、字母、下划线
\t: 制表符
\b:单词边界
\s: 空白符
x|y:取x或者y其中的任意一个 *
[a-z]: a到z中的任意一个字母 [0-9]+ \d+ [A-Z] *
[a-z,A-Z,0-9]:a-z或者A-Z或者0-9之间的任意字符 *
[@#]:@或者#中的任意一个字符
[^a-z]:除了a-z之外的任意字符
():分组 *
(?:):只匹配,不捕获 *
(?=):正向预查
(?!):负向预查
普通元字符:除特殊元字符以外的
如: b n d e
修饰符
正则的修饰符:
i-->ignoreCase :不分区大小写
m-->multiline:多行匹配
g-->global:全局匹配 *
let reg = /^f$/i;
正则的使用
test:检测当前字符串是否可以用当前正则进行匹配,如果匹配成功就返回true,否则返回false
1、以什么开头: ^
以什么结尾: $
let reg = /18$/; // 以18结尾
console.log(reg.test('189')); // false
console.log(reg.test('198')); // false
console.log(reg.test('234567818')); // true
--------------------------------------------------------------------------------
let reg = /^18/; // 以18开头
console.log(reg.test('189')); // true
console.log(reg.test('198')); // false
console.log(reg.test('18234567818')); // true
--------------------------------------------------------------------------------
let reg = /^18$/; // 以18开头并且以18结尾
console.log(reg.test('189')); // false
console.log(reg.test('198')); // false
console.log(reg.test('1845618')); // false
console.log(reg.test('1818')); // false
console.log(reg.test('18')); // true
--------------------------------------------------------------------------------
let reg = /^\d{2}$/; // 0-9之间的数字出现两次
console.log(reg.test('e2')); // false
console.log(reg.test('2e')); // false
console.log(reg.test('2e2')); // false
console.log(reg.test('22')); // true
console.log(reg.test('57')); // true
// 如果 ^ $ 都不加,那只要字符串中出现符合规则的字符就可以
//如果加上 ^ $那匹配的字符必须跟正则里规则一样才可以
2.转义字符 \
let reg = /^2.3$/; // 以2开头,中间任意字符,以3结尾
// . 除了换行符之外的任意字符
console.log(reg.test('2.3')); // true
console.log(reg.test('2e3')); // true
console.log(reg.test('2@3')); // true
--------------------------------------------------------------------------------
let reg = /^2\.3$/; // '2.3'
// 把特殊元字符转化为普通元字符
console.log(reg.test('2.3')); // true
console.log(reg.test('2e3')); // false
console.log(reg.test('2@3')); // false
--------------------------------------------------------------------------------
// 把普通元字符转化为特殊元字符
let reg = /^\d$/ // 0-9之间的数字
let str = '中\\国'; // 转义字符在字符串里也适用(第一个\把第二个\转化为普通的字符串了)
console.log(str);
--------------------------------------------------------------------------------
let reg = /^\\d$/; // 我只想匹配 '\d'
console.log(reg.test('\\d')); // true
3、x|y:x或者y之间取一个
let reg = /^18|29$/;
console.log(reg.test('18')); // true
console.log(reg.test('29')); // true
console.log(reg.test('189')); // true
console.log(reg.test('129')); // true
console.log(reg.test('118219')); // false
console.log(reg.test('1589')); // false
// 直接写 x|y会产生很乱的优先级,一般咱们这样写的时候都会有()进行分组,小括号可以改变处理的优先级
--------------------------------------------------------------------------------
let reg = /^(18|29)$/;
console.log(reg.test('18')); // true
console.log(reg.test('29')); // true
console.log(reg.test('129')); // false
console.log(reg.test('189')); // false
console.log(reg.test('1829')); // false
4、[]中不允许出现多位数,而且中括号一般都是普通含义
let reg = /^[21-68]$/; // [2,1-6,8] // 从2或者1-6或者8中任意取一个
console.log(reg.test('22')); // false
console.log(reg.test('68')); // false
console.log(reg.test('2')); // true
console.log(reg.test('5')); // true
console.log(reg.test('228')); // false
--------------------------------------------------------------------------------
// 而且中括号一般都是普通含义
let reg = /^[.]$/; // .就是普通元字符
console.log(reg.test('.')); // true
console.log(reg.test('1')); // false
--------------------------------------------------------------------------------
let reg = /^[\d]$/; // \d还是特殊意义的元字符
console.log(reg.test('6')); // true
console.log(reg.test('1')); // true
--------------------------------------------------------------------------------
// 年月日
// 匹配身份证中的年份
// - 四位数
// - 前一位应该是1或者2
// - 后边随便了
// 2001 1995 1993 1990
let reg = /^[1-2](\d{3})$/;
let reg = /^[1-2]\d{3}$/
// 月: 01-12 01-09 10-12
// 01-09 0[1-9]
// 10-12 1[0-2]
let reg = /^(0[1-9]|1[0-2])$/ // 匹配月份
let reg1 = /^(0[1-9]|10|11|12)$/ // 匹配月份
// 日:01-31 01-09 10-29 30-31
// 01-09 10-19 20-29 30-31
let reg = /^(0[1-9]|[1-2][0-9]|3[0-1])$/;
let reg1 = /^(0[1-9]|1[0-9]|2[0-9]|3[0-1])$/;
5、():分组
// 1、提高匹配的优先级
// 2、分组引用
--------------------------------------------------------------------------------
let str = 'moon' // 'seew'; 'meeeo'
// ([a-z])\1:把刚才小括号里出现的字符再重新出现一次
let reg = /^[a-z]([a-z])\1[a-z]$/;
console.log(reg.test('moon')); // true
--------------------------------------------------------------------------------
// 让第一次分组的内容再次出现两次
let reg = /^[a-z]([a-z])\1\1[a-z]$/;
console.log(reg.test('mooon')); // true
--------------------------------------------------------------------------------
let str1 = 'abab';
let reg = /^([a-z][a-z])\1$/;
// /^([a-z]{2})\1$/
// /^([a-z])([a-z])\1\2$/;
console.log(reg.test('abab')); // true