首页 > 网站 > WEB开发 > 正文

DOM笔记(十):JavaScript正则表达式

2024-04-27 14:15:01
字体:
来源:转载
供稿:网友

DOM笔记(十):javaScript正则表达式

一、RegExp

ECMAScript通过RegExp类型类支持正则表达式,语法和Perl类似:

var exp = /pattern/flags;

patternb部分是任何简单的或复杂的正则表达式;flags是每个正则表达式所带的一个或者多个标志。

正则表达式的模式匹配支持三个标志:

g:全局模式,即模式应用于整个字符串,而非在发现第一个匹配项时立即停止

i:不区分大小写模式

m:多行模式,即到达一行文本末尾是还会继续茶查找下一行中是否存在与模式匹配的项。

1、创建正则表达式

Javascript创建正则表示有两种方式:字面量创建和RegExp对象创建。

//字面量创建var pattern1 = /[bc]at/i;var pattern2 = //[bc/]at/ig;//RegExp对象创建var pattern3 = new RegExp("[bc]at","i");  //与pattern1等效var pattern4 = new RegExp("//[bc//]at","ig");  //与pattern2等效

二者的区别有两个方面:对特殊字符的转换方式和实例创建。

RegExp构造函数的模式参数是字符串,所以需要对特殊字符进行双重转义,区别如下:

//w//hello/

字面量模式等价的字符串
//[bc/]at/“//[bc//]at”
//d./d{1,2}/“//d.//d{1,2}”
//w//hello/“//w////hello”

在ECMAScript 3中,字面量形式共享一个RegExp实例,而构造函数的每个实例都不同

var re = null,      i;for(i=0;i<3;i++){     re = /cat/g;     re.test("catastrophe");}for(i=0;i<3;i++){     re = new RegExp("cat","g");     re.test("catastrophe");}

在低版本浏览器中,如IE6,对于第一个循环只弹出一次true,其余是false。第二个循环都弹出true。

在ECMAScript 5中规定:使用正则表达式字面量跟使用RegExp构造函数一样,每次调用都创建新的实例。所以两个循环在现代浏览器中都弹出true。

2、RegExp实例属性

属性说明
global布尔值,是否设置了g标志
ignoreCase布尔值,是否设置了i标志
multiline布尔值,是否设置了m标志
lastIndex整数,下一次匹配开始的字符位置
source正则表达式的字符串表示

3、方法

常用的方法有两个:exec()和test(),均接受一个字符串参数。

若存在匹配项,exec()返回一个数组,数组有两个额外的属性:index和input。index表示匹配项在字符串中的位置,input表示源字符串,即exec()的参数。在数组中,第一项是与整个模式匹配的字符串,其他项则与捕获组匹配(若没有捕获组,则只包含一项)。不存在匹配项,exec()返回null。

test()表示字符串中是否存在匹配项,存在返回true,不存在返回false。

var text = "mom and dad and bady";var pattern = /mom( and dad( and bady)?)?/gi;var matches = pattern.exec(text);alert(matches.length);    //3alert(matches.index);     //0alert(matches.input);     //mom and dad and badyalert(matches[0]);        //mom and dad and badyalert(matches[1]);        //and dad and badyalert(matches[2]);        //and bady

对于exec()而言,若不设置全局标志g,在同一个字符串上多次调用exec()始终返回第一个匹配项的信息;若设置了全局标志g,每次调用exec()则从上次匹配的位置处继续查找字符串。

二、String类型

String类型是字符串的对象包装类型,与Number、Boolean等一样(DOM笔记(九):引用类型、基本包装类型和单体内置对象 ),也可以用new来创建字符串。模式匹配在字符串处理中是很有用的,String类型也定义了多个与其相关的方法。

match(pattern):pattern是一个字面量正则表达式或RegExp对象,本质上和exec()方法一样。

var text = "cat,bat,sat,fat";var pattern = /.at/;var matches = text.match(pattern);//var matches = pattern.exec(text);alert(matches.index);alert(matches[0]);alert(pattern.lastIndex);

search(pattern):参数和match()相同,从开头开始查找,返回第一个匹配项的索引,若没有匹配项,返回-1

var text = "cat,bat,sat,fat";var pos = text.search(/at/);alert(pos);   //1

replace(oldstring,newstring):用newstring替换oldstring。第一个字符串可以是一个模式对象,第二个字符串可以结合捕获组使用,或者是一个函数。

var text = "cat,bat,sat,fat";var pattern = /(.at)/g;var re = text.replace(pattern,"Word($1)");alert(re);  //word(cat),word(bat),word(sat),word(fat)

如果模式中没有捕获组,则用空字符串代替。

若第二个参数是函数,则该函数接收三个参数:模式匹配项、模式匹配项在字符串中的位置和原始字符串。
function htmlEscape(text){    return text.replace(/[<>"&]/g,function(match,pos,text)        {            switch(match)            {                case "<":                    return "&lt;";                case ">":                    return "&gt;";                case "&":                    return "&amp;";                case "/"":                    return "&quot;";            }        });}//返回:&lt;p class=&quot;greeting&quot;&gt;helloWorld&lt;/p&gt;alert(htmlEscape("<p class=/"greeting/">helloWorld</p>"));

若正则表达式中定义了多个捕获组,则传递给函数的依次是匹配项、第一个捕获组、第二个捕获组。。。。最后两个参数不变。

split(string[,limit]):分隔字符串,返回一个数组。string可以是一个普通的字符串,也可以是一个模式匹配对象。可选的limit表示返回数组的大小

var colorText = "red,blue,yellow,black";  alert(colorText.split(","));   //[red,blue,yellow,black]alert(colorText.split(",",2));  //[red,blue]alert(colorText.split(//W/));  //[red,blue,yellow,black]

三、正则表达式的规则

字符

说明

/

将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“n”匹配字符“n”。“/n”匹配一个换行符。序列“//”匹配“/”而“/(”则匹配“(”。

^

匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“/n”或“/r”之后的位置。

$

匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“/n”或“/r”之前的位置。

*

匹配前面的子表达式零次或多次。例如,zo*能匹配“z”以及“zoo”。*等价于{0,}。

+

匹配前面的子表达式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。

?

匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“do”或“does”中的“do”。?等价于{0,1}。

{n}

n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o。

{n,}

n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。

{n,m}

m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”将匹配“fooooood”中的前三个o。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。

?

当 该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而 默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”,“o+?”将匹配单个“o”,而“o+”将匹配所有“o”。

.

匹配除“/n”之外的任何单个字符。要匹配包括“/n”在内的任何字符,请使用像“[./n]”的模式。

(pattern)

匹配pattern并获取这一匹配。所获取的匹配可以从产生的Matche

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表