正则表达式
复习字符串操作
indexOf 查找
substring 获取子字符串
charAt 获取某个字符
split 分割字符串,获得数组
找出字符串中的所有数字
用传统字符串操作完成
用正则表达式完成
正则和正则的写法
让计算机能够读懂人类的规则
正则都是操作字符串的1
2var re = /a/; // 建议使用此种简写写法,性能较下面一种好;尽量不要让正则表达式为空,否则这里//会被认为是注释,需要注意两个/之间的内容不是字符串
var re = new RegExp('a'); // 当正则需要传参的时候,必须用此种写法 var re = new RegExp(param);
正则表达式的常用方法
test
test
字符串判断
返回真假
正则.test(字符串)
例子:是否有不是数字的字符
正则去匹配字符串,如果匹配成功就返回真,如果匹配失败就返回假
test的写法:正则.test(字符串)1
2
3
4
5var str = 'abcdef';
var re = /b/;
var re2 = /w/;
alert(re.test(str)); // true
alert(re2.test(str)); // false
1 | // 转义字符 (本来字符有自身的意思,加上反斜杠后就变成了另外的意思) |
search
字符串搜索
返回出现的位置
字符串.search(正则)
忽略大小写:i--ignore
正则去匹配字符串,如果匹配成功,就返回匹配成功的位置,如果匹配失败就返回-1
search的写法:字符串.search(正则)
正则默认是区分大小写的,加标识i不区分大小写1
2
3
4
5
6
7
8
9
10var str = 'abcdef';
var re = /b/;
var re1 = /w/;
var re2 = /B/;
var re3 = /B/i;
// var re3 = new RegExp('B', 'i');
str.search(re); // 1
str.search(re1); // -1
str.search(re2); // -1
str.search(re3); // 1
match
match
获取匹配的项目
返回数组
量词:+
全局匹配:g–global
例子:找出所有数字
正则去匹配字符串,如果匹配成功,就返回匹配成功的数组,如果匹配不成功,就返回null
match的写法:字符串.match(正则)
正则默认匹配成功就会结束,不会继续匹配,加标识g(全局匹配)全部查找
量词:匹配不确定的位置
- : 至少出现一次
1 | var str = '234s28t34820'; |
replace
replace
替换所有匹配
返回替换后的字符串
字符串.replace(正则,想替换的)
例子:敏感词过滤
匹配子项
例子:日期格式化
正则去匹配字符串,匹配成功的字符替换成新的字符串
replace的写法:字符串.replace(正则,新的字符串)
第二个参数可以是一个字符串,也可以是一个回调函数,函数的第一个参数就是匹配成功的字符1
2
3
4
5
6
7
8var str = 'aaa';
var re = /a/;
str.replace(re,'b');
alert(str); // 'baa';
str.replace(re,function(){
return 'b';
});
alert(str); // 'baa';
练习:敏感词过滤
匹配子项:小括号()(还有另外一个意思,分组操作)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16var str = '2018-11-6';
var re = /(\d+)(-)/g;
str.replace(re, function($0,$1,$2){
// 第一个参数:正则整体
// 第二个参数:第一个小括号里的正则,即第一个子项
// 第三个参数:第二个小括号里的正则,即第二个子项
// alert($0); // 2018- 11-
// alert($1); // 2018 11
// alert($2); // - -
return $1 + '.'; // '2018.11.6'
return $0.substring(0,$0.length-1) + '.'; // '2018.11.6'
});
var str = 'abc';
var re = /(a)(b)(c)/;
alert(str.match(re)); // [abc,a,b,c] (当match不加g的时候才可以获取到子项的集合)
正则表达式字符类
字符类:一组相似的元素(字符) [] 中括号的整体代表一个字符1
2
3
4
5var str = 'abc';
var str1 = 'abdc';
var re = /a[bde]c/;
alert(re.test(str)); // true
alert(re.test(str1)); // false
排除:^ 如果^写在[]里面的话,就代表排除1
2
3var str = 'awc';
var re = /a[^bde]c/;
alert(re.test(str)); // true
范围:1
2
3var str = 'abc';
var re = /a[a-z0-9A-Z]c/;
alert(re.test(str)); // true
练习:过滤标签
转义字符
- . (点) 任意字符 (. 真正的点需要转义)
- \d \w \s \b
- \D \W \S \B
- \1 重复子项
- 例子
- 获取class元素
- 找重复项最多的字符和个数
\b: 独立的部分 (起始,结束,空格)
\B: 非独立的部分1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32var str = 'onetwo';
var re = /\bone/;
var re1 = /one\b/;
alert(re.test(str)); // true
alert(re1.test(str)); // false
// ...
var str='thisis';
console.log(/\bthis/.test(str)) //true
var str='啊thisis';
console.log(/\bthis/.test(str)) //true
var str=' thisis';
console.log(/\bthis/.test(str)) //true
var str='.thisis';
console.log(/\bthis/.test(str)) //true
var str='-thisis';
console.log(/\bthis/.test(str)) //true
// 关键点来了:
var str='wthisis';
console.log(/\bthis/.test(str)) //false
var str='3thisis';
console.log(/\bthis/.test(str)) //false
var str='_thisis';
console.log(/\bthis/.test(str)) //false
// 只有三面三种情况才会返回false,也就是t的前面不能是\w(字母、数字、下划线),如果是就会匹配不成功。
练习:获取class元素
正则中的重复的子项
\1 : 重复的第一个子项
\2 : 重复的第二个子项1
2
3var str = 'abca';
var re = /(a)(b)(c)\1/;
alert(re.test(str)); // true
可以用于标签的匹配<div></div>
1 | // 找重复项最多的字符和个数 |
正则中的量词和首尾匹配
量词 : {}
{4,7} : 最少出现4次,最多出现7次
{4,} : 最少出现4次
{4} : 出现4次
- : {1,} 最少出现1次
? : {0,1} 出现0次或1次
- : {0,} 最少出现0次
^ : 在正则的开始位置,代表起始
$ : 在正则的结尾位置,代表结束
例子:
-判断是不是QQ号
-去掉前后空格
常用正则例子
高级表单校验
匹配中文:[\u4e00-\u9fa5]
行首行尾空格:^\s|\s$
Email:^\w+@[a-z0-9]+(.[a-z]+){1,3}$
网址:[a-zA-Z]+://[^\s]*
QQ号:[1-9][0-9]{4,9}
邮政编码:[1-9]\d{5}
身份证:[1-9]\d{14}|[1-9]\d{17}|[1-9]\d{16}x
正则与面向对象
把方法包在一个空间里–命名空间(JSON对象,把同一类方法包在一起)1
2
3
4
5var re = {
qq: /[1-9][0-9]{4,9}/,
email: /^\w+@[a-z0-9]+(\.[a-z]+){1,3}$/
};
console.log(re.email);