ECMAScript通过RegExp类型来支持正则表达式。
在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。
1. 正则表达式基础
1.1 普通字符:字母、数字、下划线、汉字以及所有没有特殊意义的字符,如1234abcd。在匹配时,匹配与之相同的字符。
1.2 特殊字符:(使用反斜杠“”进行转义)
匹配字符类型 | d | D | s | S | w | W | . |
数字 | 非数字 | 空白字符 | 非空白字符 | 字母/数字/下划线/汉字 | 不是 w范围的 | 除换行符外的字符 | |
匹配字符范围[] | [0-9] | [a-m] | [^x] | [^aeiou] | |||
0到9中任意 一个数字 | 匹配a到m中 任意一个字母 | 除x外的所有字符 | 除aeiou外的所有字符 | ||||
匹配位置 | ^ | $ | B | ||||
字符串开始 | 字符串结束 | 单词开始和结束 | 单词中间 | ||||
匹配次数 | ? | * | + | {n} | {n,} | {n,m} | |
0或1次 | 0或多次 | 1或多次 | 匹配n次 | 匹配至少n次 | 匹配n到m次 | ||
特殊字符 | a | f | v | e | |||
响铃符x07 | 换页符x0C | 换行符x0A | 回车符x0D | 制表符x09 | 垂直制表符x0B | ESC符x1B | |
其它 | a|b | () | |||||
a或b | 括号内为一组匹配 |
1.3 匹配模式flags
g:全局模式,应用于所有字符,不会在发现第一个匹配项时立即停止;
i:不区分大小写模式,即确定匹配项时忽略模式与字符串的大小写;
m:表示多行模式,即在到达一行文本末尾时还会继续查找下一行中是否存在模式匹配的项;
1.4 正则表达式方法与String匹配方法
正则表达式
方法 | 说明 |
exec() | 执行正则表达式的匹配,返回一个数组 |
test() | 测试正则表达式的匹配,返回布尔值 |
toString() | 将RegExp对象转换成字符串 |
toSource() | 返回RegExp对象的源代码 |
String匹配方法
match() | 与RegExp的exec()方法相同,接受一个参数, 要么是一个正则表达式,要么是一个RegExp对象 |
search() | 接受一个参数,和match()相同,返回字符串中第一个匹配项的索引,没有找到匹配项时返回-1, search()始终从字符串开头向后查找 |
replace() | 接受两个参数:一个RegExp对象或字符串和一个字符串或函数,若第一个参数为字符串,则只会替换第一个字符串,若想替换所有子字符串,第一个参数必须为指定了全局标志(g)的正则表达式 |
2. JavaScript中使用正则表达式对象RegExp
2.1 创建正则对象
a.使用字面量: var exp = /pattern/flags; pattern:任意正则表达式,flags:匹配模式
b. 构造函数 : var exp = new RegExp(pattern,flags); pattern和flags需要双重转义
实例1:简单验证用户名注册:
//用户验证,JS正则表达式 //用户名要求:数字、字母(不分大小写)、汉字、下划线,5-25个字符之间 //1.当有汉字存在时,获取用户名长度,注意汉字为双字节,统一单位长度,汉字应该统计为两个字符 function getLength(str){ return str.replace(/[^x00-xff]/g,"xx").length; //x00-xff表示所有单字节ASCII值的字符, //然后取反匹配双字节的字符并替换为两个单字节字符, } //对用户名进行验证,应该在输入框失去焦点事件进行验证 //oName是用户名input oName.onblur = function(){ //非法字符验证 var re = /[^wu4e00-u9fa5]/g; //w表示数字,字母(不分大小写),下划线 //汉字的ASCII值区间为: u4e00-u9fa5 if (re.test(this.value)) { name_msg.innerHTML="不能含有非法字符"; } //用户名不能为空 else if(this.value==""){ name_msg.innerHTML="用户名不能为空!" } //用户名长度不能超过25个字符 else if(getLength(this.value)>25){ name_msg.innerHTML="长度不能超过25个字符!" } //用户名长度不能超过25个字符 else if(getLength(this.value)<6){ name_msg.innerHTML="长度不能小于6个字符!" } //可以利用Ajax进行用户名是否存在的验证 }
实例2:字符串字符是否全都相等
//通过循环对比字符串首字母与字符串每个字符 //相同则设定一个中间值就加1,最后如果和字符串长度等同,则就全是相同字符 function findStr(str,n){ var tmp = 0; for (var i = 0; i < str.length; i++) { if (str.chatAt(i)==n) { tmp++; } } return tmp; } var m = findStr(str,str.chatAt(0)); if (m == str.length) { //字符串是相同字符 };
实例3:字符串字符是否都为数字或都为字母
//验证不能都为数字 //即验证一个都未匹配到非数字 var re_n = /[^d]/g; if (!re_n.test(str)) { //注意匹配有取反操作 //不能全为数字 } //验证不能都为字母 //即验证一个都未匹配到非字母 var re_t = /[^a-zA-Z]/g; //注意匹配有取反操作 if (!re_t.test(str)) { //不能全为字母 }
实例4:正则表达式直接限制位数
//验证登录名 //1.只能输入5-20个字符,以“字母”开头 //2.可以带“数字” “_” “.” 的字符串 var re = /^[a-zA-Z][w.]{4,19}$/g; if(re.test(oInput.value)==false){ alert("× 格式错误!") } else{ alert("√ 格式正确!") }