用实例浅谈Javascript正则表达式

正则表达式用到的元字符:( { [ \ ^ $ | ) * + .] }。如果表达式中用到以上字符需要用“\“进行转义。

<script language="javascript" type="text/javascript">
var toMatch = "cat, ";
var regex = /cat/;
alert(regex.test(toMatch));
//true
</script>

  表达式“/cat/”表示匹配一个以c开头的字符,接着是一个字符a,接着是一个字符t的文本。

<script language="javascript" type="text/javascript">
var toMatch = " cat, ";
var regex = /^cat$/;
alert(regex.test(toMatch));
//false
</script>

表达式“/^cat$/”表示匹配一个以字符c作为一行的开头,后面跟着一个字符a,接着是字符t作为结束的文本。字符“^”表示一行的开头,“$”表示一行的结束。修改一下字符串即可匹配,如下:

<script language="javascript" type="text/javascript">
var toMatch = "cat";
var regex = /^cat$/;
alert(regex.test(toMatch));
//true
</script>

<script language="javascript" type="text/javascript">
var toMatch = "7:10am,5:30pm";
var regex = /[0-1]?[0-9]:[0-5][0-9](a|p)m/;
alert(regex.test(toMatch));
//true
</script>

表达式“/[01]?[0-9]:[0-5][0-9](a|p)m/”中[]表示字符组,[0-9]表示匹配数字0,1,2,3,4,5,6,7,8,9。“-”表示范围:[0-9]等同于[0123456789],“-”只有在[]里面而且不能紧挨着“[”才表示元字符。如果这样写[-0-2]就表示表示匹配字符“-,0,1,2“。如:

<script language="javascript" type="text/javascript">
var toMatch = "-1,22";
var regex = /[-0-2][0-9]/;//第一个“-“表示普通连字符,第二个表示范围,做为元字符
alert(regex.test(toMatch));
//true
</script>

 “(a|p)”是一种多选结构,表示匹配字符a或p,“|”表示或,此处可以替换为[ap]。但是字符组与多选结构是不同的,字符组只能匹配列出的单一字符,多选结构可以匹配任意长度字符。

如:

<script language="javascript" type="text/javascript">
var toMatch = "grey gray";
var regex = /g(rey|ray)/g;//匹配g后面是rey或者是ray
//var regex=/gr[ea]y/g; //匹配gr后面是e或者是a,接着是字符y
//var regex=/gr [eay] /g;//匹配gre ,gra,gry只是字符组中的一个字符
var matches = toMatch.match(regex);
var len = matches.length;
for (var i = 0; i < len; i++) {
alert(matches[i]);
}
</script>

 表达式“/g(rey|ray)/g“中的 g是global的缩写,match() 方法将执行全局检索,找到文本中的所有匹配子字符串。

<script language="javascript" type="text/javascript">
var toMatch = "123456abc ";
var regex = /\d+\D+/;
var matches = toMatch.match(regex);
var len = matches.length;
for (var i = 0; i < len; i++) {
alert(matches[i]);
}
</script>

表达式“/\d+\D+/”中“\d,\D”都是正则表达式中预定义的类。\d 等同于[0-9],只匹配数字。\D等同于[^0-9],匹配非数字,[]里面的“^“表示非里面列出的字符。除了这两个预定义类外,还有\s等同于[ \t\n\x0B\f\r],匹配空白字符;\S等同于[^ \t\n\x0B\f\r],匹配非空白字符;\w等同于[a-zA-Z_0-9],匹配单词字符(字母、数字和下划线);\W等同于[^a-zA-Z_0-9],匹配非单词字符。

<script language="javascript" type="text/javascript">
var toMatch = "<b>bei</b><b>jing</b>";
// var regex = /<b>.*?<\/b>/;//匹配“<b>bei</b><b>jing</b>”
var regex = /<b>.*<\/b>/;//匹配“<b>bei</b>”
var matches = toMatch.match(regex);
var len = matches.length;
for (var i = 0; i < len; i++) {
alert(matches[i]);
}
</script>

表达式“/<b>.*<\/b>/”中“.”等同于[^\n\r]表示匹配除了换行和回车之外的任何字符。“*”表示该表达式匹配的次数(0次或多次),属于匹配优先量词:匹配尽可能多的字符。匹配优先量词还有“?(0 次或1次),+(1次或多次),{n}(匹配n次),{n,}(至少匹配n次),{n,m}(至少n次,最多m次)”。与匹配优先相对的就是忽略优先:匹配尽可能少的字符,忽略优先量词就是在匹配优先量词后面加上上“?”。如表达式“/<b>.*?<\/b>/”中的“*?”就是忽略优先量词,在本例中匹配到“<b>bei</b>”之后就停止匹配。

<script language="javascript" type="text/javascript">
var toMatch = "<b>bei<b>jing</b>";
// var regex = /<b>.*?<\/b>/;//匹配“<b>bei<b>jing</b>”
var regex = /<b>((?!<b>).)*?<\/b>/g;//匹配“<b>jing</b>”
var matches = toMatch.match(regex);
var len = matches.length;
for (var i = 0; i < len; i++) {
alert(matches[i]);
}
</script>

表达式“/<b>((?!<b>).)*?<\/b>/”中“?!“是排除环视。环视表示匹配一个位置,不匹配任何字符。(?!<b>)表示只有当<b>不在字符串当前位置是才匹配成功。此外,”?=“是顺序环视,表示当前位置的右边。”?<=“逆序环视,表示当前位置的左边。

<script language="javascript" type="text/javascript">
var toMatch = "cat123456cat";
var regex = /(cat)\d+\1/g;
var matches = toMatch.match(regex);
alert(RegExp.$
1);//弹出第一个分组内容cat
var len = matches.length;
for (var i = 0; i < len; i++) {
alert(matches[i]);
}
</script>

表达式“/(cat)\d+\1/“中”(cat)“表示一个分组,”\1“是对分组”(cat)“的引用。如果有第二、第三个分组,分别用\2,\3即可引用。“/(cat)\d+\1/“等同于 “/(cat)\d+cat/“。“(?:cat)”中“?:”表示只分组但是不捕获内容,这样“\1”就不能引用第一个分组了,RegExp.$1将为空。           

JavaSscript中对正则的支持是通过RegExp对象实现的。我们可以这样定义正则表达式:

var regex = new RegExp("cat")
var regex = new RegExp("cat","g");

或者用正则表达式字面量:

var regex = /cat/;
var regex = /cat/g;

RegExp对象有个方法test(),如果给定字符串匹配正则表达式,就返回true,否则false。RegExp还有一个exec()方法:

<script language="javascript" type="text/javascript">
var toMatch = "cat,fat,at";
var regex = /at/g;
regex.exec(toMatch);
alert(regex.lastIndex);
regex.exec(toMatch);
alert(regex.lastIndex);
regex.exec(toMatch);
alert(regex.lastIndex);
regex.exec(toMatch);
alert(regex.lastIndex);
</script>

Exec()方法每次返回一个匹配到的条目,本例中第一次调用时匹配cat 中的at,lastIndex返回3。第二次调用从第一次匹配的位置后开始查找,本例中就是从位置3开始继续查找。最后一次调用没用匹配的,lastIndex为0。

String对象有个match() 方法,如果 regexp 没有标志 g,那么 match() 方法就只能在给定文本中执行一次匹配。如果没有找到任何匹配的文本, match() 将返回 null。否则,它将返回一个数组,其中存放了与它找到的匹配文本有关的信息。该数组的第 0 个元素存放的是匹配文本,而其余的元素存放的是与正则表达式的子表达式匹配的文本。如果 regexp 具有标志 g,则 match() 方法将执行全局检索,找到 定文本中的所有匹配子字符串。若没有找到任何匹配的子串,则返回 null。如果找到了一个或多个匹配子串,则返回一个数组。不过全局匹配返回的数组的内容与前者大不相同,它的数组元素中存放的是给定文本中所有的匹配子串,而且也没有 index 属性或 input 属性。String对象的search()方法返回在给定文本中第一次匹配的位置。

<script language="javascript" type="text/javascript">
var toMatch = "cat,fat,at";
var regex = /at/g;
alert(toMatch.search(regex));
//1
</script>

String对象的replace()方法以及split()都可以用正则表达式当做参数。

<script language="javascript" type="text/javascript">
var toMatch = "cat,fat,at";
var regex = /at/g;
alert(toMatch.replace(regex,
"oo"));
</script>
<script language="javascript" type="text/javascript">
var toMatch = "cat,fat,at";
var regex = /at/g;
var arr = toMatch.split(/\,/);
var len = arr.length;
for (var i = 0; i < len; i++) {
alert(arr[i]);
}
</script>
posted @ 2011-02-28 09:06  秋无语  阅读(2721)  评论(1编辑  收藏  举报