用来处理字符串的规则
只能处理字符串
是一个规则:可以检验一个字符串是否符合规则(test),也可以把字符串中符合规则的内容捕获到(exec/match)
let str = "jiayou jiayou ";
let reg = /\d+/; // 表示规则是是否含有字符串
reg.test(str); //false
str = '2020-9-21';
reg.exec(str);//['2020',index:0,inputs:'原始字符串']
创建正则表达式
//1.字面量方式
let reg1 = /\d+/;//两个斜杠之间包起来的都是用来描述正则规则的原字符
//2.构造函数的方式里面有两个参数,一个是原字符字符串,一个是修饰符字符串,两个参数都是字符串
let reg2 = new RegExp("\\d+");//特殊符号需要转译字符
组成正则表达式的两部分
元字符:定义正则的规则
//元字符
//1.量词元字符,控制出现的次数
//* 0 到多次可以出现可以不出现
//+ 1到多次
// ? 0次或者1次,要么不出现,出现就只出现一次
//{n}出现n次,n是0或者正整数
//{n,}出现n到多次
//{n,m}出现n到m次,包含n也包含m次
//2.特殊元字符,单个或者组合代表特殊含义的
\ 表示转译字符
. 除了换行符以外的任意字符
^ 以紧接着的那个元字符为开始
$ 以哪个元字符作为结束
\n 换行符
\d 0~9之间的一个数字
\D 非0~9之间的任意一个字符
\w 数字字母下划线中的任意一个字符
\W 非数字字母下划线中的任意一个字符
\s 一个空白字符包含空格,制表符换页符
\t 一个制表符(tab建)
\b 匹配一个单词的边界
x|y | 一个竖杠代表或者可以多个连着用 1|5|4
[xyz] x或者y或者z中的一个字符[]中括号之间的任意一个字符
[^xyz]除了xyz以外的字符
[a-z]指定a-z这个范围内的任意字符[0-9a-zA-Z_] === \w
() 分组
(?:)只匹配不捕获
(?=)正向预查
(?!)负向预查
//3.普通元字符代表本身含义的
/ttt/这个正则匹配的就是字符串ttt
修饰符
//正则表达式常用的修饰符i,m,g
i表示ignoreCase, 忽略单词大小写匹配
m multiline多行匹配
g globale全局匹配
/A/.test('aaa');//false
/A/i.test('aaa');//true
元字符解析
1. ^ $
let reg = /^\d/;必须以数字开头
reg.test('aa');//false
reg.test('2020aa');//true
let reg2 = /$\d/;必须以数字结尾
let reg3 = /\d/;只要包含数字就行
let reg4 = /^\d¢/;只能是跟规则一样的内容
//验证手机号码,11位第一个数字是1
let reg = /^1\d{10}$/
验证当前字符串必须符合某种规则
转译字符''
let reg = /^2.3$/;
reg.test('2.3')//true
reg.test('2@3')//true
reg.test('23')//false
//因为小数点.是除了\n以外的任意字符
let reg2 = /^2\.3$/;
reg.test('2.3')//true
reg.test(2@3)//false
x|y 一般和小括号一起使用,用来处理优先级
let reg = /^(18)|(29)$/;//表示18开头或者29结尾
[]中括号
//中括号中出现的字符一般都代表本身的含义
let reg = /^[@+]+$/;//@和+中的一个开头,出现一个或者多个
reg.test('@@');//true
reg.test('@+');//true
//中括号中不存在多位数
reg = /^[18]$/;表示1或者8中的一个
常用的正则表达式
//1.验证是否为有效数字
//分析规则
//1.可能出现+ - 号,也可能不出现,出现的话只能出现一位
[+-]//就表示+或者-
[+-]?;//?表示出现0或者1为
//2.一位的话,0-9都可以,多位的话首位不能为0
(\d|([1-9]\d+))//3.小数部分可能有可能没有,一旦有后面必须有小数点和数字
(\.\d+)?可能有也可能没有,有的话一定只能出现一次
小数点的话必须用\.来转移
let reg = /^[+-]?(\d|([1-9]\d+))(\.\d+)?$/
2.验证密码,数字字符下划线6-16位
let reg = /(?![0-9]{6,16})(?![a-Z]{6,16})(^[\w]{6,16}$)/
3.验证邮箱
邮箱的名字可以由数字字母下划线-和.这几部分组成
但是-.不能连续出现也不能作为开头
let reg = /^\w+((-\w+)|(\.\w+))*@[A-Za-z0-9]+((\.|-)([A-Za-z0-9]+)*\.[A-Za-z0-9]+)$/、
//^\w+((-\w+)|(\.\w+))*//1.^\w+开头必须是数字字母下划线而且必须是1到多个
//2.还可以是-数字字母下划线或者.数字字母下划线,整体上0到多个((-\w+)|(\.\w+))*
//中间是@符号
//@符号后面的紧跟的是数字或者字符,出现1到多位@[A-Za-z0-9]//((\.|-)([A-Za-z0-9]+)*//对@后面的域名进行补充
//\.[A-Za-z0-9]+匹配域名
4.身份证
//1.一共18位
//2.最后一位肯能是X
//身份证前六位:省市县
//中间八位是出生年月日
//最后四位:
//最后一位是X或者数字
//倒数第二位偶数是女奇数是男
//其余的是经过算法算出来的
//()分组捕获
let reg = /^(\d{6})(\d{4})(\d{2})(\d{2})\d{2}(\d)(\d|x)$/
reg.exec("210282199603310226")得到一个数组将每个分组捕获的内容捕获到
验证一个字符串中哪个字母出现次数最多,出现的次数
var str = 'jiayoujiauyouyidingxing'; var obj ={}; [].forEach.call(str,char=>{ if(obj[char]){ return obj[char]++;; }else{ obj[char] = 1; } }); var temp = Object.keys(obj).sort((a,b)=>{ return obj[b] -obj[a] }); console.log(temp[0],obj[temp[0]])
replace方法
var str = "abcdedfa";
str.replace('a','b');//只能访问一个,替换结果bbcdedfa
//把aabb的形式编程bbaa
var reg = /(\w)\1(\w)\2/g;
var str = 'aabb';
console.log(str.replace(reg,'$2$2$1$1'))
//'$2$2$1$1'表示反向引用子表达式2的内容,反向引用子表达式2里面的内容,反向引用子表达式1里面的内容,反向引用子表达式1里面的内容
str.replace(reg, function(){//第一个参数是正则表达式匹配的结果,第二个参数是第一个子表达式匹配的内容,第三个参数是第二个子表达式匹配的内容
return $2 + $2 + $1 + $1;
})
//把the-first-name ===> theFirstName
var str = 'the-first-name'; var reg = /(-)(\w)/g var res = str.replace(reg,function($,$1,$2){ return $2.toUpperCase(); }) console.log(res)
正向预查/a(?=b)/后面跟着b的那个a,b不参与捕获
贪婪匹配 非贪婪匹配在任何一个量词后面加一个?
字符串去重
var str = 'aaaaaaabbbbbbbcccccccc';
var reg = /(\w)\1*/g反向引用1个或者多个
str.replace(reg,"$1")
100000000000----->100,000,000,000,000,
var str = '10000000000'; var reg1 = /(?=(\B)(\d{3})+$)/g; var res = str.replace(reg1, '.') console.log(res)
//首先从后往前查,$
//然后数字得是3的倍数个
//得是正向预查?=表示后面的非单词边界的,前面的空
//最后将空替换成'.'