正则表达式是一串字符,用于在文本字符串中进行查找和替换。javascript正则表达式主要用来验证客户端的输入数据。
一.js中创建正则表达式的2种方法:
1.字面量方式
正则表达式是包含在一对斜杠之间的字符,在结束斜杠后,是用于修饰检索模式的可选参数,它们是:
i:忽略大小写
g:全局匹配
m:多行匹配
var reg =/abc/
var reg2=/abc/ig
2.构造函数方式
var reg = new RegExp("abc");
var reg = new RegExp("abc","ig");
二.测试正则表达式
1.test()方法:如果被查找的字符串包含正则表达式中表示的模式,返回true,否则返回false。
<script type="text/javascript">
var str = "time to study";
var regex = /tud/;
if (regex.test(str)) {
alert("found!");
} else {
alert("no match!");
}
</script>
2.exec()方法:如果匹配失败,返回null,否则返回包含和正则表达式匹配的字符串的数组
如果执行exec方法的正则表达式没有分组(没有括号括起来的内容),那么如果有匹配,他将返回一个只有一个元素的数组,这个数组唯一的元素就是该正则表达式匹配的第一个串;如果没有匹配则返回null。
exec如果找到了匹配,而且包含分组的话,返回的数组将包含多个元素,第一个元素是找到的匹配,之后的元素依次为该匹配中的第一、第二...个分组。
分组在下面介绍。
三.String的正则表达式方法
String类提供了4个使用正则表达式的方法
match | 返回表达式中的子串或者null |
replace(regex,replacement) | 用replacement替换regex |
search(regex) | 返回字符串中regex的开始位置 |
split(regex) | 从字符串中以给定的表达式分割出子字符串数组 |
match:
<script type="text/javascript">
var matchArray = new Array();
var str = "I love the small of clover";
var regex = /love/g;
matchArray = str.match(regex);
document.write("found: " + matchArray.length);
</script>
输出:found: 2
search:
<script type="text/javascript">
var str = "I love the small of clover";
var regex = /love/;
var index = str.search(regex);
document.write("found at pos: " + index);
</script>
输出:found at pos: 2
replace:
<script type="text/javascript">
var str = "abc;abcc;abccc";
var regex = /;/;
var splitArr = new Array();
splitArr = str.split(regex);
for (var i=0; i<splitArr.length; i++) {
document.write(splitArr[i]+"<br/>");
}
</script>
输出:
abc
abcc
abccc
split:
<script type="text/javascript">
var str="111,222,333";
var arr=str.split(",");
for (var i in arr)
document.write(arr[i] + "<br/>");
</script>
输出:
111
222
333
四.正则表达式的匹配
1.元字符:
. | 查找单个字符,除了换行和行结束符 |
\w | 查找单词字符 |
\W | 查找非单词字符 |
\d | 查找数字 |
\D | 查找非数字字符 |
\s | 查找空白字符 |
\S | 查找非空白字符 |
\0 | 查找null字符 |
\n | 查找换行符 |
\f | 查找换页符 |
\r | 查找回车符 |
\t | 查找制表符 |
\v | 查找垂直制表符 |
\xxx | 查找以八进制数 xxx 规定的字符 |
\xdd | 查找以十六进制数 dd 规定的字符 |
\uxxxx | 查找以十六进制数 xxxx 规定的 Unicode 字符 |
匹配:字符串中包含一个大写N,后面是任意2个字符,再接al
<script type="text/javascript">
var str="Normal";
var regex=/N..mal/;
var arr=str.split(",");
alert(regex.test(str));
</script>
匹配:数字6后面接2个数字的字符
var regex=/6\d\d/;
2.方括号:匹配一个范围内的字符
[a-z][0-9] | 匹配括号中的字符集中的任意字符 |
[^a-z][0-9] | 匹配不在括号中的字符集中的任意字符 |
匹配:包含至少一个A~Z的大写字母,后面是a~z的小写字符,最后是eve
var regex=/[A-Z][a-z]eve/;
"Believe"不匹配,"BeLieve"可以。
匹配:至少包含A~Z,a~z,0~9,下划线中的一个字符的字符串
var regex = /[A-Za-z0-9_]/;
匹配:不含数字的字符串
var regex = /[^0-9]/;
3.重复模式
x? | 至多一个x |
(xyz)? | 至多一个xyz模式 |
x* | 0个或者多个x |
(xyz)* | 0个或者多个xyz模式 |
x+ | 1个或者多个x |
(xyz)+ | 1个或者多个xyz模式 |
x{m,n} | 至少m个或者至多n个x |
x{m} | m个x |
x{m,} | 至少m个x |
匹配:1位小数或者整数
var regex=/\d.?\d/;
4.锚元字符
如果要从行,字,字符串开始或者结束处匹配,需要用锚元字符。
^ | 从行首或者字符串开始处匹配 |
$ | 从行尾或者字符串末尾处匹配 |
\b | 匹配字符边界 |
\B | 匹配非字符边界 |
匹配:以Abc作为行首的字符串
var regex=/^Abc/;
匹配:字符串以J或者K开头
var regex=/^[JK]/
匹配:字符串以M结尾
var regex=/M$/;
匹配:查找以love开头和结尾的词
var regex=/\blove\b/;
\b匹配的是词边界而非特定字符,"I love u"匹配成功,因为love是单词love的开头。
5.或模式:包含可选模式匹配
匹配:TOM或者JIM
var regex=/TOM|JIM/;
6,分组和聚合:
将一组字符放在括号内就实现了分组
匹配:Tom Jerry,Jim Jerry或者Nick Jerry
var regex= /^(Tom|Jim|Nick) Jerry/;
如果没有括号,就匹配Tom,或者Jim或者Nick Jerry
7.记录或捕获
如果一个正则表达式中包括分组,如果匹配成功,第一个分组会被记录在RegExp的$1对象中,第二个分组记录在$2中,依此类推。
var str = "Tom Jerry";
var regex=/(Tom)\s(Jerry)/;
var arr = str.match(regex);
document.write(RegExp.$1);
document.write("<br/>" + RegExp.$2);
输出:
Tom
Jerry
稍微修改一下代码,验证“exec如果找到了匹配,而且包含分组的话,返回的数组将包含多个元素,第一个元素是找到的匹配,之后的元素依次为该匹配中的第一、第二...个分组。"
<script type="text/javascript">
var str = "Tom Jerry";
var regex=/(Tom)\s(Jerry)/;
var arr = str.match(regex);
alert(arr[0]);
alert(arr[1]);
alert(arr[2]);
</script>
分别弹出的是:Tom Jerry, Tom, Jerry
五.一些例子
检查邮政编码:
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=GBK">
<meta name="generator" content="PSPad editor, www.pspad.com">
<title></title>
<script type="text/javascript">
function checkZipCode(zipcode) {
var regex = /^\d{6}$/;
if (regex.test(zipcode.value)==false) {
alert("邮政编码必须是6个数字");
zipcode.focus();
return false;
}
}
</script>
</head>
<body>
<form name="zipform" action="">
<input type="text" name="zipcode" size=6 />
<input type="button" value="check" onClick="checkZipCode(zipform.zipcode);">
</form>
</body>
</html>
删除多余空格和破折号
<script type="text/javascript">
var str="111 222 -11";
var regex=/[ -]+/g;
var newStr=str.replace(regex,"!");
alert(newStr);
</script>
删除非数字
<script type="text/javascript">
var str="111(222_)11&&";
var regex=/\D/g;
var newStr=str.replace(regex,"");
alert(newStr);
</script>