正则表达式是一串字符,用于在文本字符串中进行查找和替换。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>