使用正则表达式的模式匹配

本文由清尘发表于2012-01-08 01:31最后修改于2014-04-25属于javascript分类

正则表达式的定义:
正则表达式直接量被定义为包含在一对斜杠(/)之间的字符。
var pattern=/s$/;
用构造函数RegExp()也可以定义一个等价的正则表达式。
var pattern=new RegExp(“s$”);

直接量字符:
在正则表达式中所有的字母符和数字都是按照直接量与自身相匹配的。
\o    NUL字符(\u0000)
\t    制表符(\u0009)
\n    换行符(\u000A)
\v    垂直制表符(\u000B)
\f    换页符(\u000C)
\r    回车(\u000D)
\xnn    由十六进制数nn指定的拉丁字符,例如,\x0A等价于\n
\uxxxx    由十六进制xxxx指定的Unicode字符,例如,\u0009等价于\t
\cX    控制字符^X。例如,\cJ等价于换行符\n

正则表达式的字符类:
[...]    位于括号之内的任意字符
[^...]    不在括号之中的任意字符
.    除换行符和其它Unicode行终止符之外的任意字符
\w    任何ASCII单字字符,等价于[a-zA-Z0-9_]
\W    任何非ASCII单字字符,等价于[^a-zA-z9_]
\s    任何Unicode空白符
\S    任何非Unicode空白符的字符,注意\W和\S不同
\d    任何ASCII数字,等价于[0-9]
\D    除了ASCII数字之外的任何字符,等价于[^0-9]
[\b]    退格直接量(特例)

正则表达式的重复字符:

{n,m}    匹配前一项至少n次,但是不能超过m次
{n,}    匹配前一项n次,或更多次
{n}    匹配前一项恰好n次
?    匹配前一项0次或1次,也就是说前一项是可选。等价于{0,1}
+    匹配前一项1次或多次,等价于{1,}
*    匹配前一项0次或多次,等价于{0,}

用于模式匹配的String方法
类String支持四种利用正则表达式的方法。最简单的是search()。该方法以正则表达式为参数,返回第一个与之匹配的子串的开始字符的位置,如果没有任何匹配的子串,它将返回-1.例如,下面的调用返回的值为4:
“JavaScript”.search(/script/i);
方法replace()执行检索与替换操作。它的第一个参数是一个正则表达式,第二个参数是要进行替换的字符串。
例如,我们可以用如下方法使用replace()将文本字符中的所有javascript(不区分大小写)统一为”Javascript”
text.replace(/javascript/gi,”JavaScript”);
如果在替换字符串中出现了符号$加数字,那么replace()将用与指定的子表达式相匹配的文本来替换这两个字符。

方法match()是最常用的String正则表达式方法。它唯一的参数就是一个正则表达式,返回的是包含了匹配结果的数组。如果该正则表达式设置了标志g,该方法返回数组包含的就是出现在字符串中的所有匹配。例如:
“1plus 2 equals 3″.match(/\d+/g)    //返回["1","2","3"]
如果该正则表达式没有设置标志g,match()进行的就不是全局性检索,它只是检索第一个匹配。但即使match()执行的不是全局检索,它也返回一个数组。在这种情况下,数组的第一个元素就是匹配的字符串,而余下的元素则是正则表达式中用括号括起来的子表达式。
例如,使用如下的代码来解析一个URL:

var testurl="visit my blog at http://www.rtfkige.cn/space-uid-6.html";
   var seurl=/(\w+):\/\/([\w.]+)\/(\S*)/;
   var result=testurl.match(seurl);
   if(result!=null){
       var fullurl=result[0];    //返回"http://www.rtfkige.cn/space-uid-6.html"
       var protocol=result[1];    //返回"http"
       var host=result[2];    //返回"www.rtfkige.cn"
       var path=result[3];    //返回"space-uid-6.html"
   }

match()返回的数组和其它的数组一样具有一个length属性。如果match()是作用于一个非全局的正则表达式。那么它返回的数组还包括另外两个属性——index和input,前者包含的是在字符串中匹配开始处的字符的位置,后者则是目标字符串的一个副本。

String对象的最后一个有关正则表达式的方法是split()。这个方法可以把调用它的字符串分解为一个子串数组,使用的分隔符是它的参数。例如:
“123,456,789″.split(“,”);    //返回["123","456","789"]
split()方法也可以以正则表达式为参数。例如,我们可以指定分隔符,允许两边有任意多个空白符:
“1,2,  3, 4,5″.split(/\s*,\s*/);    返回["1","2","3","4","5"]

用于模式匹配的RegExp方法:
exec( )方法对一个指定的字符串执行一个正则表达式。如果没有找到任何匹配,它将返回null,但是,如果它找到一个匹配,将返回一个数组,就像方法match( )为非全局检索返回的数组一样。
另一个RegExp方法是test( )。它的参数是一个字符串,如果这个字符串包含正则表达式的一个匹配,它就返回true;

var pattern=/Java/i;
    var    text="JavaScript is more fun than Java!";
    var result=pattern.test(text);
    console.log(result);