正则的定义
按照一定的语法规则书写的一个规则字符串(JavaScript正则对象),这个规则字符串可以帮我们去处理文本,在文本里面找寻出满足定义规则的字符。主要可以实现查找、替换等操作。
语法格式
语法糖(推荐):
var reg = /a/;
注意
:/ 正则规则 /; / / 被称为正则里面的定界符,在定界符里面我们可以书写正则表达式。
RegExp
var reg = new RegExp(‘a’); //RegExp 可以理解为系统自带的一个正则类(构造函数)
正则对象之test方法
作用
: test方法,主要是去判断字符串里面【是否】有满足正则表达式的字符,返回值是 boolean true代表存在 false代表不存在。
使用场合
:test方法使用的场景主要是用作条件判断的表达式 if(express) while(express)
注意
:一般正则对象还可以和字符串的方法进行配合使用.
字符串常用方法复习
replace(reg)方法
在某个字符串里面进行查询某个满足条件的字符,然后使用新的字符作为替换值。只会查找一次。
var str='asdfs';
var newstr=str.replace('s',function ($0){
console.log($0); //s
return $0.toUpperCase(); //toUpperCase()转换为大写
});
console.log(str); //asdfs
console.log(newstr); //aSdfs
注意
:replace方法存在一个高级特性,替换值的参数可以使用匿名函数作为参数,然后会把匿名执行后的返回值作为新的替换值使用。
match(查找的字符)方法
在某个字符串里面查询是否存在满足条件的字符,并把找到的结果放置到一个数组里面(一般这个方法和正则对象配合使用)
var str='asdfs';
var rs=str.match('s');
console.log(rs); //["s", index: 1, input: "asdfs", groups: undefined]
repeat方法
将某个字符串重复指定的次数(敏感字替换获取敏感字长度后转换为*)
var string = '*';
console.log(string.repeat(10)); // 配合正则完成敏感信息替换功能 ---> 敏感字--->****
substring方法
对某个字符串进行截取,参数是一个下标 [star, end) 包含起始,不包含结束下标。
var str='sdfaf';
var newstr=str.substring(1,3); //[1,3)
console.log(newstr); //df
split方法
用于把一个字符串分割成字符串数组
var str='sfdasf';
console.log(str.split('-')); //["sfdasf"]
正则对象和字符串方法配合
match方法
var str='sfdaf234dsgf234dg2';
var reg=/\d+/g;
/*
* \d:0-9任意字符
* +:前面的字符出现次数大于1
* /g:全部查找
* */
console.log(str.match(reg)); //["234", "234", "2"]
//查找字符串中是否包含非数字字符
var iPhoneNum='13234234sd34';
var reg=/\D/g; // \D:除了0-9的其他字符
console.log(iPhoneNum.match(reg)); //["s", "d"]
// 判断是否存在
console.log(reg.test(iPhoneNum)); //true
模式修饰符
模式修饰符是放在正则表达式的后面,用来修饰正则如何去处理字符串。
常见的修饰符有:
g(global) 代表是全局匹配
i(ignore) 代表是忽略大小写(因为正则默认是区分大小写的)
replace方法
案例:敏感字(需要根据敏感字的长度来显示*的个数)
<body>
用户留言信息:<br>
<textarea name="content" id="content" cols="30" rows="10"></textarea>
<hr>
<button id="btn">敏感字替换</button>
<hr>
<textarea name="recontent" id="recontent" cols="30" rows="10"></textarea>
</body>
<script>
var oBtn=document.getElementById('btn');
var userValue=document.getElementById('content');
oBtn.onclick=function (){
var reg=/s|d|a/g; //设置敏感词
var value=userValue.value;
var newValue=value.replace(reg,function ($0){
console.log($0);
return '*'.repeat($0.length);
});
console.log(newValue);
document.getElementById('recontent').value=newValue;
}
</script>
![在这里插入图片描述](https://img-blog.csdnimg.cn/f1194bcf1f5a4fbc8f97d92a118e7235.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01hX2ppYW8=,size_16,color_FFFFFF,t_70)
子项的引用和捕获
什么是子项
也被人叫做分组,把一个正则表达式里面的部分使用一个小括号包裹起来的部分被称为子项,从左至右开始,从1开始计算,第一个子项,第二个子项…可以在回调函数里面获取到子项里面的内容,然后进行自己的逻辑操作。
字符串函数实现
案例:查找字符串里面出现次数最多的字符和次数。
let str='abcdaa';
function findMaxCharInString(str){
var sortstr=str.split('').sort().join('');
// \1代表正则表达式里面对第一个分组的引用
var reg=/([a-z])\1*/g;
// == var reg=/([a-z])\1{0,}/g;
var max_count=0;
var max_value='';
/*
* $0:找到了字符串
* $1:找到了分组
* */
sortstr.replace(reg,function ($0,$1){
if ($0.length>=max_count){
max_count=$0.length;
max_value=$1;
}
})
return{
"max_count":max_count,
"max_value":max_value
}
}
console.log(findMaxCharInString(str)); //{max_count: 3, max_value: "a"}
捕获
例如:var reg = /([a-z])\1{0,}/gi;
\1 代表捕获第一个小括号里面的内容;在整个正则里面使用分组后,会把分组的内容保存在内存缓冲区里面,可以通过 \1 、\2 、\3…这种方式获取缓存区里面的内容,这个行为被称为捕获。
原子
var reg = /a/g;
什么是原子
就是书写正则表达式里面的最基本的单元,例如 a 就是一个原子。
常见的原子可以分如下几类
- 普通原子 a b c d 1 2 _ & 就是常见的单个字符 [a-z][A-Z][0-9]_
- 特殊原子,也被称为元字符或者转义字符
- \d [0-9]中一个数字
- \D [
^
0-9] 中的字符 - \s 代表空格 制表符 …不可见的字符(space)
- \w 代表[0-9a-zA-Z_] 其中一个
- \W [
^
0-9a-zA-Z_]^
一般叫做托字符,代表取反的意思
- 字符组 [abc] 代表是abc中的任何一个 [aeiou] 代表的a e i o u 中的其中一个
- 字符单元 (abc) 代表是abc一个整体
什么是转义字符
可以通过一定的方式让某些字符具有特殊含义的字符,或者是本身就存在特殊含义的字符。 \
一般我们叫做转义符(1. 可以使普通的字符具有特殊的含义 2. 让有特殊含义的字符变得普通)
var reg = /\d/;
- 例如 d 本身只是一个字符d ,但是如果在前面加上一个 \d ,代表是0-9之间一个数字
- **-**就是正则一个特殊的字符,代表除开换行之外的任何字符 a b c 1 0 ;唯独不能表示\n 如果现在需要表示一个普通的点号 1.23 可以 .
- + 也是元字符, 代表的是量词 1 或者 多次… +
行首行尾
案例:去除行首和行尾空格
var str=' asd sdf ';
// var reg=/^\s+/ig; //行首
// var reg=/\s+$/ig; //行尾
var reg=/^\s+|\s+$/ig; //行首|行尾
var newstr=str.replace(reg,'');
console.log('('+str+')');
console.log('('+newstr+')');
量词
量词常见存在两种写法:
第一类
***** 代表0或者多次
+ 1代表或者多次
? 0或者1次
第二类
{n,m} 代表是范围
{n} 代表具体的次数 {1, }
{n,} 大于等于n次{0,1}
案例:手机号码验证
/*
* 手机号码规则:
* 1. 现在手机号码可能11或者12;例如:15342158902 015342158902,手机号码最前的0可以出现,也可以不出现
* 2. 对于11手机号码,首位必须1
* 3. 除开首位之后的第二位只能是 3 4 5 7 8 9
* 4. 除开首位和第二位之后的位数可以0-9之间任何一个
* */
let str='15342158902';
/*
* ^1:第一位必须为1
* [345789]:第二位必须是345789中的一个
* {9}:剩下位数
* */
let reg=/^1[345789]\d{9}$/;
console.log(reg.test(str));
console.log(str.match(reg));