目录
一、正则的基本使用步骤
正则是描述字符串特征的
先准备描述字符串内容的特征
再准备一段查找的字符串范围
进行查找即可
如何描述特征?
需要用到正则对象
语法
/特征/
例:
/男/ // 找字符串里有没有 `男` 这个内容,特征就是符合有`男`
准备一段字符串范围,再去查找特征
语法
/男/.test( 字符串范围 )
// 例
console.log( /黑马/.test( '乾坤未定,你我皆黑马' ) ) // true
console.log( /黑马/.test( '目光朦胧处,忽现一少年身骑白马' ) ) // false
就会去找这个字符串范围里,有没有男
这个字,有会得到 true, 没有会得到 false
案例:判断文本中又没有 刘德华 三个字
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<input type="text" class="text">
<script>
let arr = document.querySelector('.text');
console.log(arr.value);
console.log(/刘德华/.test(arr.value));
arr.addEventListener('blur', function() {
if (/刘德华/.test(arr.value)) {
alert('有敏感词');
} else {
alert('可以使用');
}
});
</script>
</body>
</html>
二、普通字符和元字符
我们自己写的规则,比如说 /男/
, /刘德华/
, /abc/
这些都是字面意思,写男就是找男,写刘德华就是找刘德华,写abc就是找abc,这就会所谓的 普通字符
但是在正则中用一些特殊的符号表示了特殊的含义,也就是说,你写一个符号,它可能不是找某个符号,而是找它所蕴含的特殊含义。例如: /./
, 它不是找 .
,因为 .
在正则中有特殊含义,那么对于这种有特殊含义的字符,我们就称之为 元字符
1、元字符-边界符
边界符 | 说明 |
^ | 以什么开始 |
$ | 以什么结尾 |
语法:
/^内容/
它不是找^内容,因为^有特殊含义,它代表以什么开头,所以这句话的意思是找 以某个内容开头的字符串
/内容$/
以什么结尾,以这个内容结尾的
注意: ^ 要写在最开头, $ 要写在最末尾
// 默认这种写法代表只要任意位置有男这个字即可
console.log( /男/.test('这个世界,有男有女!') ) // true
console.log( /男/.test('男人就是难') ) // true
console.log( /男/.test('我的性别是男') ) // true
// 找以 男 开头
console.log( /^男/.test('这个世界,有男有女!') ) // false
console.log( /^男/.test('男人就是难') ) // true
console.log( /^男/.test('我的性别是男') ) // false
// 找以 男 结尾
console.log( /男$/.test('这个世界,有男有女!') ) // false
console.log( /男$/.test('男人就是难') ) // false
console.log( /男$/.test('我的性别是男') ) // true
<1> 精确匹配
把 ^
和 $
结合起来就是精确匹配
语法:
/^内容$/
代表字符串只能是这个内容,不能有多余的部分,如果只是这个内容就得到true,否则得到false
举例:
// 这个就叫精确匹配
// 只能有 李建雨真帅 这个五个字,不能有其他任意内容
console.log( /^李建雨真帅$/.test('李建雨真帅棒棒哒') ) // false
console.log( /^李建雨真帅$/.test('李建雨真帅非常牛逼') ) // false
console.log( /^李建雨真帅$/.test('李建雨真帅李建雨真帅李建雨真帅') ) // false
console.log( /^李建雨真帅$/.test('李建雨真帅') ) // true
2、元字符 - 量词
量词 | 说明 |
* | 出现0次或多次 |
+ | 出现1次或多次 |
? | 出现0次或1次 |
{n} | 出现n次 |
{n,} | 出现至少n次 |
{n,m} | 出现至少n次,最大m次 |
注意:这些量词只修饰它左边的那一个字符,所以要修饰整体,记得加小括号包起来
3、元字符 - 字符类
<1> | 或
或,要么左边要么右边
/1|a|b|d|4/
代表要字符串中出现1、a、b、d、4中的任意一个就返回true
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
console.log(/1|a|b|d|4/.test('哈喽1'));
console.log(/1|a|b|d|4/.test('哈喽a'));
console.log(/1|a|b|d|4/.test('哈喽b'));
console.log(/1|a|b|d|4/.test('哈喽d'));
console.log(/1|a|b|d|4/.test('哈喽4'));
</script>
</body>
</html>
<2> [] 或的集合
匹配字符集合:中括号里任意一个都可以,也是或的意思
/[1abd4]/
代表要字符串中出现1、a、b、d、4中的任意一个就返回true
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
// [] 或 的用法
console.log(/[1abd4]/.test('哈喽1'));
console.log(/[1abd4]/.test('哈喽a'));
console.log(/[1abd4]/.test('哈喽b'));
console.log(/[1abd4]/.test('哈喽d'));
console.log(/[1abd4]/.test('哈喽4'));
</script>
</body>
</html>
<3> [-] 范围
表示范围:[起点-终点]
[a-z] // a-z中的任意一个
[0-9] // 0-9中的任意一个
[A-Z] // A-Z中的任意一个
[a-zA-Z0-9] // 代表任意一个大小写字母或者任意一个数字
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
//[-] 范围的使用
console.log(/[a-zA-Z0-9]/.test('表示只要有a到z,A到Z,0到9这个范围内的字符,都会返回ture'))
</script>
</body>
</html>
<4> [^] 非,除了某范围外
/[^a-zA-Z0-9]
a到z,A到Z,0到9这个范围外的字符,都会返回ture
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
//^ 范围的使用
console.log(/[^a-zA-Z0-9]/.test('a到z,A到Z,0到9这个范围外的字符,都会返回ture'))
</script>
</body>
</html>
<5> . 表示\r与\n以外的任意字符
只要没有\n或者\r,都可以返回true
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
// . 表示\r与\n以外的任意字符
console.log(/[.]/.test('只要没有\n或者\r,都可以返回true,所以这句话返回false'))
</script>
</body>
</html>
<5> 匹配中文
/[\u4e00-\u9fa5]/
计算机中肯定是不支持中文的,所以中文在计算机中本质上都是转成了对应的英文字母
其中有个很出名的编码叫 unicode 编码,这个叫万国码
万国码:它包含了世界上各种文字,最终都对应到英文字母,用各种字母表示各种文字
/[\u4e00-\u9fa5]/
\u4e00 就是第一个汉字
\u9fa5 就是最后一个汉字
所以这个范围就代表任意汉字
\u 就是unicode编码的前缀
案例:判断用户输入的账号是否合法(字母、数字、下划线,且最少6位,最多10位)
<!DOCTYPE html>
<html lang="CH">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
span {
display: inline-block;
width: 250px;
height: 30px;
vertical-align: middle;
line-height: 30px;
padding-left: 15px;
}
.error {
color: red;
background: url(./error1.png) no-repeat left center;
}
.right {
color: green;
background: url(./right.png) no-repeat left center;
}
</style>
</head>
<body>
<input type="text">
<span></span>
<script>
let input = document.querySelector('input');
let sp = document.querySelector('span');
//需求:6-10位长度,由数字字母下划线组成
input.addEventListener('blur', function() {
if (/^[a-zA-Z0-9_]{6,10}$/.test(input.value)) {
//符合条件
sp.classList.remove('error');
sp.classList.add('right');
sp.innerHTML = '输入格式正确';
} else {
//不符合条件
sp.classList.remove('right');
sp.classList.add('error');
sp.innerHTML = '输入格式错误';
};
});
</script>
</body>
</html>
案例:用户昵称是否合法(昵称必须是中文字母数字,长度是2-4之间)
<!DOCTYPE html>
<html lang="CH">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
span {
display: inline-block;
width: 250px;
height: 30px;
vertical-align: middle;
line-height: 30px;
padding-left: 15px;
}
.error {
color: red;
background: url(./error1.png) no-repeat left center;
}
.right {
color: green;
background: url(./right.png) no-repeat left center;
}
</style>
</head>
<body>
<input type="text">
<span></span>
<script>
let input = document.querySelector('input');
let sp = document.querySelector('span');
input.addEventListener('blur', function() {
//[\u4e00-\u9fa5]万国码汉字范围
if (/[\u4e00-\u9fa5]{2,4}$/.test(input.value)) {
//符合条件
sp.classList.remove('error');
sp.classList.add('right');
sp.innerHTML = '输入格式正确';
} else {
sp.classList.remove('right');
sp.classList.add('error');
sp.innerHTML = '输入格式错误';
};
});
</script>
</body>
</html>
4、元字符 - 预定义类
预定义类:就是正则里用特殊符号来标识它属于哪一类数据
预定义类 | 说明 |
\d | 匹配数字 |
\D | 匹配非数字 |
\w | 匹配文本字符,也就是任意字母、数字、下划线 |
\W | 匹配非文本字符,也就是除了字母、数字、下划线 |
\s | 匹配不可见字符 比如空格 |
\S | 匹配可见字符 |
三、正则修饰符
语法:/正则内容/修饰符。例:/[a-z]/i 忽略大小写的
i:忽略大小写
g:全局匹配
两个一起写,写成 ig 或 gi 就代表 既忽略大小写,也全局匹配
常用于替换文本中的内容:
字符串的replace,可以替换字符串内容
str.replace(正则表达式, 要替换的内容)
// 例
let str = 'oooOOO哈哈哈OOOooo'
str = str.replace(/o/ig, '') // 把所有的o不区分大小写全部替换成空字符串
console.log(str) // 哈哈
案例: 过滤敏感字
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<textarea name="" id="" cols="30" rows="10"></textarea>
<button>提交</button>
<div></div>
<script>
let area = document.querySelector('textarea');
let btn = document.querySelector('button');
let div = document.querySelector('div');
btn.addEventListener('click', function() {
let text = area.value.replace(/敏感词一|敏感词二|敏感词二/ig, '**');
div.innerHTML = text;
});
</script>
</body>
</html>
四、正则本质是对象与它的构造函数创建法
正则本质上就是一个对象, /规则/
这种写法是字面量表示法
也可以用构造函数创建出一个正则
let 对象名 = new RegExp('规则', '修饰符')
例子:
let reg = new RegExp('ab', 'ig') // 代表忽略大小写而且全局的找ab
// 如果要找字母数字下划线怎么写? 字面量:/\w/
let reg2 = new RegExp('\\w', '修饰符')
注意:如果要写预定义类,要多加一个\,例如\\w 和 \\d,因为 \ 在js字符串中是转义的意思,所以要写 \ 就必须写 \\
五、如何用敏感词库替换
先把敏感词库的数组转成字符串(用 |
)
再然后用 new RegExp
来创建正则对象
let words = ['敏感词1', '敏感词2', '敏感词3', '敏感词4' ]
let str = words.join('|')
let reg = new RegExp(str, 'ig')
console.log( "今天大家都很敏感词1,也很有敏感词2,大家要爱护敏感词3,支持敏感词4!".replace(reg, '**') )
六、正则的exec方法(了解)
正则对象除了 test
方法,还有一个方法叫 exec
,就是用来做提取内容的