Js正则表达式基础使用

130 阅读3分钟

用来处理字符串的规则

只能处理字符串

是一个规则:可以检验一个字符串是否符合规则(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 09之间的一个数字
\D 非09之间的任意一个字符
\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的倍数个
//得是正向预查?=表示后面的非单词边界的,前面的空
//最后将空替换成'.'