常见符号表示的含义:
\d 表示匹配 0~9之间的任一数字,相当于[0,9]。
\D 表示非数字字符
\w 表示任意字母数字或下划线,相当于[0-9a-zA-Z_]。
\W [^a-zA-Z_0-9] 非单词字符
(单词字符包括:a-z、A-Z、0-9,以及下划线。)\s 表示空白字符(包含制表符,空格符,断行符等),相当于[\t\r\n\v\f]。
\S 表示非空白字符
\b 表示匹配到的词的边界。
\B 表示匹配到的非词的边界
. 表示匹配除回车(\r),换行(\n)r,行分隔符(\u2028) ,段分隔符(\u2029)以外的所有字符。
* 表示某个模式出现0次或多次相当于{0,}。
+ 表示某个模式出现1次或多次相当于{1,}。
? 表示某个模式出现0次或多次相当于{0,1}。
{n} 表示某个模式出现n次。
{n,m} 表示某个模式出现n~m次。
^表示以什么开头
$ 表示以什么结尾
^$ 表示空字符串
[^] 表示对后面的匹配条件取反
/(hunger){10}/圆括号包起来表示分组匹配
前瞻
exp1(?=exp2) 匹配后面是exp2的exp1
exp1(?!exp2) 匹配后面不是exp2的exp1/(hello)|(world)/ /hello|world/ 表示或,两者其中之一
\t 水平制表符
\r 回车符
\n 换行符
\f 换页符
\v 垂直制表符
\0 空字符
正则表达式的写法
- javaScript通过内置对象RegExp支持正则表达式,有两种方式创建正则表达式对象
var reg = new RegExp("[a]","g")
var reg = / [a]/g - 修饰符
g:global,全文搜索,不添加的话搜索到第一个结果停止搜索
i:ingore case,忽略大小写,默认大小写敏感
m:multiple lines,多行搜索
正则表达式一些属性
RegExp实例对象有五个属性
global:是否全局搜索,默认是false
ignoreCase:是否大小写敏感,默认是false
multiline:多行搜索,默认值是false
lastIndex:是当前表达式模式首次匹配内容中最后一个字符的下一个位置,每次正则表达式成功匹配时,lastIndex属性值都会随之改变
source:正则表达式的文本字符串
正则表达式方法
- reg.test() 用于测试字符转中是否存在正则表达式的模式,若存在返回true 若不存在返回false
- reg.exec() 用于在字符串中查找符合正则表达式的字符,若查找成功则返回一个数组,包含匹配到的字符,字符的索引,输入的字符串,匹配字符组成的数组的length属性
正则表达式在字符串方法中的应用
- str.match(reg) 在非全局调用下返回结果与exec相同,在全局调用下,只返回匹配到的字符组成的数组
- str.search(reg) 方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串,返回匹配字符在原字符串的索引。
它会忽略正则表达式对象的lastIndex属性,并且总是从字符串的开始进行检索,这意味着它总是返回字符串的第一个匹配的位置 - str.split(reg) 以匹配到的字符分割字符串,返回一个数组(组成的数组中不包含匹配到的字符串)
- str.replace(reg,string) 以新的字符串替换匹配到的字符串
(str.replace(old,new)当有多个old时只能替换第一个) - str.replace(reg,function(){a,b,c,d})
例子
'2398rufdjg9w45hgiuerhg83ghvif'.replace(/\d+/g,function(r){
return '('+r+')';
}); //"(2398)rufdjg(9)w(45)hgiuerhg(83)ghvif"
第一个参数很简单,是匹配字符串
第二个参数是正则表达式分组内容,没有分组则没有该参数
第三个参数是匹配项在字符串中的index
第四个参数则是原字符串
全局调用
调用全局的RegExp对象的exec()时,它会在RegExp实例的lastIndex属性指定的字符处开始检索字符串string
当exec()找到了与表达式相匹配的文本时,在匹配后,它将把RegExp实例的lastIndex属性设置为匹配文本的最后一个字符的下一个位置。可以通过反复调用exec()方法来遍历字符串中的所有匹配文本
当 exec() 再也找不到匹配的文本时,它将返回null,并把lastIndex属性重置为0
简单应用
1 去除字符串首尾空白字符
function trim(){
var str = "abc ";
var reg = /^\s*|\s+$/g;
var str2 = str.replace(reg,'');
return str2;
}
var str = trim()
console.log(str)
2 判断用户输入是否为邮箱
function isEmail(){
var str = "123456@qq.com";
var reg = /^\S+[@]\S+[.]\S+$/g;
return reg.test(str)
}
var result = isEmail()
console.log(result)
3 判断用户输入的是不是手机号
function trim(){
var str = "18012345671";
var reg = /^1\d{10}$/
return reg.test(str)
}
var result = trim()
console.log(result)
4 判断用户输入的是不是合法的用户名(长度6-20个字符,只能包括字母、数字、下划线)
var reg = /^\w{6,20}$/
5 判断用户输入的是不是合法密码(长度6-20个字符,只包括大写字母、小写字母、数字、下划线,且至少至少包括两种)
function isValidPassword(str){
var keyNot=/^\w{6,20}$/;
var key=/(^[A-Z]+$)|(^[a-z]+$)|(^[0-9]+$)|(^_+$)/;
if(keyNot.test(str)){
if(key.test(str)){
return "请输入6-20位密码(大写字母、小写字母、数字、下划线,至少包含其中两种)";
}
else {
return "设置成功"
}
}
else{
return "请输入6-20位密码(大写字母、小写字母、数字、下划线,至少包含其中两种)"
}
}
6 写一个正则表达式,得到如下字符串里所有的颜色
var subj = "color: #121212; background-color: #AA00ef; width: 12px; bad-colors: f#fddee #fd2 "
var reg = /#[0-9a-zA-Z]{6}/g
7 下面代码输出什么? 为什么? 改写代码,让其输出['hunger', 'world'].
var str = 'hello "hunger" , hello "world"';
var pat = /".*"/g;
str.match(pat);
///////输出[""hunger" , hello "world""]
///////原因是. 匹配除换行和行结束符外的任意单个字符,而 *是贪婪模式,在满足条件的情况下,会尽可能多的匹配
var str = ' hello "hunger" , hello "world" ';
var pat = /".*?"/g;
str.match(pat); //["hunger", "world"]