1.什么是正则表达式?
简单来说,它就是检验字符串的一种规则。
2.正则表达式的作用?
主要用于表单验证。
3.如何创建正则表达式?
方法 | 语法 |
---|---|
字面量 | /正则表达式/标志位 |
构造函数 | new RegExp(“正则表达式”,“标志位”) |
区别 :字面量的效率更高一些。当正则需要交给用户来制定的时候,我们就可以选择第二种方式。把正则当做参数传进来。
4.标志位
方法 | 释义 |
---|---|
g | 全局匹配 |
i | 不区分大小写 |
5.正则表达式的方法
语法 | 释义 |
---|---|
正则表达式.test(字符串) | 检测字符串中是否包含正则表达式的内容,返回布尔值。 |
正则表达式.exec(字符串) | 返回一个数组,没有匹配,返回null |
注:字符串中有个match方法,语法为:字符串对象.match(正则表达式),它返回一个数组,没有匹配时,返回null。他们的区别是,exec不受g的影响,会受到组的影响。match会受到g的影响,有g时,不会返回子匹配。
6.元字符
口诀:三 三 二 三个一
- 三 {} [] ()
方法 | 释义 |
---|---|
{} | 表示{}前面的一个或一组字符连续出现的次数。 |
{m} | 表示{}前面的一个或一组字符连续出现m次。 |
{m,} | 表示{}前面的一个或一组字符连续出现至少m次。 |
{m,n} | 表示{}前面的一个或一组字符连续出现至少m次,最多n次。 |
— | — |
[] | 表示范围。 |
() | 表示组 |
- 三 * + ?
方法 | 释义 |
---|---|
* | 表示 * 前面的一个或一组字符连续出现0至无限次,即{0,} |
+ | 表示+前面的一个或一组字符连续出现1至无限次,相当于{1,} |
? | 表示?前面的一个或一组字符连续出现0至1次,相当于{0,1} |
- 二 ^ $
方法 | 释义 |
---|---|
^ | 定头或取反,写在正则表达式的开头,限制开头字符。写在[]中开头部分,表示取反,如[^0-9],表示除数字以外的部分 |
$ | 定尾,写在正则表达式的结尾,限制结尾字符 |
另,定头定位情况下,未写明次数,表示必须出现一次。
- 三个一 . | \
方法 | 释义 |
---|---|
. | 表示可以模糊匹配任意一个字符 |
| | 表示或者 |
\ | 转义符 |
\d | 表示数字,相当于[0-9] |
\D | 表示非数字,相当于[^0-9] |
\s | 表示空白 |
\S | 表示非空白 |
\w | 表示数字字母下划线,相当于[a-zA-Z0-9_] |
\W | 表示非数字字母下划线,相当于[^a-zA-Z0-9_] |
\b | 表示单词边界 |
7.字符串方法
- 字符串对象.match(正则表达式):返回一个数组,没有匹配,返回null
- 字符串对象.replace(旧串,新串):替换
- 字符串对象.search(正则):类似indexOf()
基础方法示例:
const re = /do/;
const str = 'how do you do';
console.log(re.test(str)); // true
区分大小写
const re = /do/;
const str = 'how Do you Do';
console.log(re.test(str)); // false
不区分大小写
const re = /do/i;
const str = 'how Do you Do';
console.log(re.test(str)); // true
另外,上面均为使用字面量的方式创建。构造函数方式为:
const re = new RegExp('do', 'i');
const str = 'how Do you Do';
console.log(re.test(str)); // true
{m}
const re = /do{3}/i; // {}前面的o字母连续出现三次
const str = 'how Do you Do';
console.log(re.test(str)); // false
const re = /do{3}/i; // {}前面的o字母出现三次
const str = 'how Dooo you Do';
console.log(re.test(str)); // true
{m}: 只要包含以d开头并且o连续出现三次,就为true,出现三次以上也是true
const re = /do{3}/i; // {}前面的o字母出现三次
const str = 'how tooo you Do';
console.log(re.test(str)); // false 须以d开头
定头定尾
const re = /^do{3}$/i; // 以d开头,以o结尾,且o出现三次
const str = 'how doooo you Do'; // str以h开头
console.log(re.test(str)); // false
定头定尾
const re = /^do{3}$/i;
const str = 'dooo';
console.log(re.test(str)); // true
{m,}:o出现至少三次
const re = /^do{3,}$/i;
const str = 'dooooooooooooo';
console.log(re.test(str)); // true
{m,n}:o出现至少三次
const re = /^do{3,5}$/i;
const str = 'dooooo';
console.log(re.test(str)); // true
[]:范围
const re = /^[abc]{3,5}$/i; // 只要字符串在[]的范围内,并且是3-5位
const str = 'aaaa';
console.log(re.test(str)); // true
[]:范围
const re = /^[abc]{3,5}$/i; // 只要字符串在[]的范围内,并且是3-5位
const str = 'aaaad';
console.log(re.test(str)); // false
[]:范围
const re = /^[a-z]{3,5}$/i; // 只要字符串在[]的范围内,并且是3-5位
const str = 'Zoo';
console.log(re.test(str)); // true
[]:范围
const re = /^[a-zA-Z]{3,5}$/; // 只要字符串在[]的范围内,并且是3-5位
const str = 'Zoo';
console.log(re.test(str)); // true
[]:范围
const re = /^[a-zA-Z0-9]{3,5}$/; // 只要字符串在[]的范围内,并且是3-5位
const str = 'Zoo';
console.log(re.test(str)); // true
[]:规定开头
const re = /^[a-z][a-zA-Z0-9]{3,5}$/;
const str = 'Zoo';
console.log(re.test(str)); // false
[]:范围
const re = /^[a-z][a-zA-Z0-9]{3,5}$/i;
const str = 'Zoo';
console.log(re.test(str)); // false
[]:定头定尾(以一位小写字母开头,中间一位小写字母或大写字母或数字,以3-5位大写字母结尾)
const re = /^[a-z][a-zA-Z0-9][A-Z]{3,5}$/;
const str = 'a1DDA';
console.log(re.test(str)); // false
[]:匹配汉字
const re = /^[\u4e00-\u9fa5]{3,5}$/;
const str = '张三丰';
console.log(re.test(str)); // true
():表示三到五组 do
const re = /^(do){3,5}$/;
const str = 'dodododo';
console.log(re.test(str)); // true
():组
const re = /^(do){3,5}$/;
const str = 'dodododod';
console.log(re.test(str)); // false
():表示do出现0-无限次
const re = /^(do)*$/;
const str = '';
console.log(re.test(str)); // true
():表示do至少出现1次
const re = /^(do)+$/;
const str = 'do';
console.log(re.test(str)); // true
():表示do最多出现1次
const re = /^(do)?$/;
const str = 'do';
console.log(re.test(str)); // true
^:取反
const re = /[^0-9]/;
const str = 'helloworld';
console.log(re.test(str)); // true
.表示通配任意一个字符
const re = /^.o.$/;
const str = 'xox';
console.log(re.test(str)); // true
|:表示或者
const re = /^男|女$/;
const str = '男';
console.log(re.test(str)); // true
|:表示或者 这里的男|女并非是二选一的,因为他不是一个整体
const re = /^男|女$/;
const str = '男男女男女男女男女男女男女男女男女男女男女男女男女男女';
console.log(re.test(str)); // true
|:表示或者 二选一
const re = /^(男|女)$/;
const str = '男男女男女男女男女男女男女男女男女男女男女男女男女男女';
console.log(re.test(str)); // false
\:转义符 .表示模糊匹配,要使用\把他转义为普通的点
const re = /^\.[a-z0-9A-Z]{2-4}$/;
const str = '.js';
console.log(re.test(str)); // true
\d:数字 这里匹配六位数的邮编
const re = /^\d{6}$/;
const str = '000000';
console.log(re.test(str)); // true
exec和match区别:无g无()
const re = /do/;
const str = 'how do you do';
console.log(re.exec(str)); // ['do']
console.log(str.match(re)); // ['do']
exec和match区别:有g无()
const re = /do/g;
const str = 'how do you do';
console.log(re.exec(str)); // ['do']
console.log(str.match(re)); // ['do','do']
exec和match区别:无g有()
const re = /(.+)do(.+)/g;
const str = 'how do you do';
console.log(re.exec(str)); // ['how do you do','how ',' you do']
console.log(str.match(re)); // ['how do you do','how ',' you do']
exec和match区别:有g有()
const re = /(.+)do(.+)/g;
const str = 'how do you do';
console.log(re.exec(str)); // ['how do you do','how ',' you do']
console.log(str.match(re)); // ['how do you do']
replace:无g只替换一个
const re = /do/;
const str = 'how do you do';
console.log(str.replace(re, 'de')); // how de you do
replace:有g全部替换
const re = /do/g;
const str = 'how do you do';
console.log(str.replace(re, 'de')); // how de you de
实战
1.去除字符串两边的空格
' a b '.replace(/(^\s+|\s+$)/g,'') // 'a b'
/(^\s+|\s+$)/的意思就是 以空白开头或者以空白结尾。
这里很容易陷入一个误区,会把正则写成/^(\s+)$/g,这个正则表达式的意思是,一个以空白开头,且以空白结尾,中间部分有大于1的空白。所以他只能替换一个为纯空白的字符串。
2.邮箱格式
111@qq.com 或111@qq.com.cn
/^\w+@\w+.[a-z]{3}(\.[a-z]{2})?$/
3.手机号
/1\d{10}/
以上。