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);    //3
alert(matches.index);     //0
alert(matches.input);     //mom and dad and bady
alert(matches[0]);        //mom and dad and bady
alert(matches[1]);        //and dad and bady
alert(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并获取这一匹配。所获取的匹配可以从产生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中则使用$0…$9属性。要匹配圆括号字符,请使用“\(”或“\)”。


(?:pattern)


匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用或字符“(|)”来组合一个模式的各个部分是很有用。例如“industr(?:y|ies)”就是一个比“industry|industries”更简略的表达式。


(?=pattern)


正 向预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例 如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配 “Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从 包含预查的字符之后开始。


(?!pattern)


负 向预查,在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如 “Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中 的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始


x|y


匹配x或y。例如,“z|food”能匹配“z”或“food”。“(z|f)ood”则匹配“zood”或“food”。


[xyz]


字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”。


[^xyz]


负值字符集合。匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“p”。


[a-z]


字符范围。匹配指定范围内的任意字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符。


[^a-z]


负值字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范围内的任意字符。


\b


匹配一个单词边界,也就是指单词和空格间的位置。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。


\B


匹配非单词边界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。


\d


匹配一个数字字符。等价于[0-9]。


\D


匹配一个非数字字符。等价于[^0-9]。


\s


匹配任何空白字符,包括空格、制表符、换页符等等。等价于[\f\n\r\t\v]。


\S


匹配任何非空白字符。等价于[^\f\n\r\t\v]。


\w


匹配包括下划线的任何单词字符。等价于“[A-Za-z0-9_]”


\W


匹配任何非单词字符。等价于“[^A-Za-z0-9_]”。


\f、\n、\r、\t、\v


匹配一个换页符、换行符、回车符、水平制表符、垂直制表符,分别等价于\x0c和\cL、\x0a和\cJ、\x0d和\cM、\x09和\cI、\x0b和\cK


\cx


匹配由x指明的控制字符。例如,\cM匹配一个Control-M或回车符。x的值必须为A-Z或a-z之一。否则,将c视为一个原义的“c”字符。


\xn


匹配n,其中n为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,“\x41”匹配“A”。“\x041”则等价于“\x04&1”。正则表达式中可以使用ASCII编码。


\num


匹配num,其中num是一个正整数。对所获取的匹配的引用。例如,“(.)\1”匹配两个连续的相同字符。


\n


标识一个八进制转义值或一个向后引用。如果\n之前至少n个获取的子表达式,则n为向后引用。否则,如果n为八进制数字(0-7),则n为一个八进制转义值。


\nm


标识一个八进制转义值或一个向后引用。如果\nm之前至少有nm个获得子表达式,则nm为向后引用。如果\nm之前至少有n个获取,则n为一个后跟文字m的向后引用。如果前面的条件都不满足,若n和m均为八进制数字(0-7),则\nm将匹配八进制转义值nm。


\nml


如果n为八进制数字(0-3),且m和l均为八进制数字(0-7),则匹配八进制转义值nml。


\un


匹配n,其中n是一个用四个十六进制数字表示的Unicode字符。例如,\u00A9匹配版权符号(?)。

四、常见正则表达式常用的正则表达式归纳

原文首发:http://www.ido321.com/1355.html

时间: 2024-08-07 04:07:47

DOM笔记(十):JavaScript正则表达式的相关文章

DOM笔记(十):JavaScript正則表達式

一.RegExp ECMAScript通过RegExp类型类支持正則表達式,语法和Perl类似: var exp = /pattern/flags; patternb部分是不论什么简单的或复杂的正則表達式:flags是每一个正則表達式所带的一个或者多个标志. 正則表達式的模式匹配支持三个标志: g:全局模式,即模式应用于整个字符串.而非在发现第一个匹配项时马上停止 i:不区分大写和小写模式 m:多行模式,即到达一行文本末尾是还会继续茶查找下一行中是否存在与模式匹配的项. 1.创建正則表達式 Ja

DOM笔记(十三):JavaScript的继承方式

在Java.C++.C#等OO语言中,都支持两种继承方式:接口继承和实现继承.接口继承制继承方法签名,实现继承则继承实际的方法和属性.在SCMAScript中,由于函数没有签名,所以无法实现接口继承,只支持实现继承. 实现继承主要依靠原型链来实现. 一.原型链 原型链是利用原型让一个引用类型继承另一个引用类型的方法,在DOM笔记(十二):又谈原型对象中,描述了构造函数.实例和原型之间的关系: 每个构造函数都有一个原型对象,原型对象包含一个指向构造函数的指针,而每个实例都包含一个指向原型对象的内部

DOM笔记(十二):又谈原型对象

因为之前谢过一篇关于原型对象的笔记:浅谈JavaScript中的原型模式.现在我又重新看到这个话题,对原型有了进一步的理解,所以,又要谈谈原型对象. 一.理解原型对象 创建的每一个函数都有一个prototype属性,它指向这个函数的原型对象.利用原型模式创建的方法和属性是被所有实例所共享的. function Person(){} Person.prototype.name="dwqs"; Person.prototype.age=20; Person.prototype.sayNam

javascript正则表达式笔记(转载)

在javascript里面的定义 1.通过RegExp构造函数定义一个正则表达式.第一个参数为正则表达式以字符串传入,第二个参数为修饰符也以字符串传入. 例:var caps = new RegExp("[A-Z]", "g"); 2.直接定义一个正则表达式直接量,表达式右正斜杠符号"/"分隔,后直接跟修饰符.(推荐用这种) 例:var caps = /[A-Z]/g; javascript正则表达式常用的字符 字符 描述 例子 [exp] 对于

DOM笔记(五):JavaScript的常见事件和Ajax小结

一.常见事件类型 1.鼠标事件 事件名称 说明 onclick 鼠标单击时触发 ondbclick 鼠标双击时触发 onmousedown 鼠标左键按下时触发 onmouseup 鼠标释放时触发 onmouseover 鼠标的光标移动到某对象上时触发 onmousemove 鼠标移动时触发 onmouseout 鼠标光标离开某对象时触发 ps:当单击一次鼠标左键的时候,将同时触发onclick.onmousedown.onmouseup三个事件,事件处理程序执行的先后顺序为:onmousedow

JavaScript正则表达式学习笔记之一 - 理论基础

自从年前得空写了两篇文章之后就开始忙了,这一忙就是2个月??.当时信誓旦旦说的定期写篇博客的计划也就泡汤了??,不过好在最近有空,顺便总结一下这两个月遇到的几个问题.第一个问题就是项目中用到了一些正则才发现之前被自己忽略的正则是时候补一补了.恰逢今天周六??,就把自己学习JavaScript正则表达式的笔记整理成文,写了这篇关于正则表达式理论基础的文章,希望本文能对有需要的同学提供帮助.号外:本文相对基础,大神请忽略??. 一. 基本概念 正则表达式是用于匹配字符串中字符组合的模式. 一种几乎可

Java学习总计(二十六)——JavaScript正则表达式,Js表单验证,原生js+css页面时钟

一.JavaScript正则表达式1.exec检索字符串中指定的值,返回找到的值,并确定其位置2.test检索字符串中指定的值,返回true或false3.正则表达式对象的创建:(1)方式一:Var rgex=new RegExp("[0-9]","模式");(2)方式二:简便写法,用双斜杠//把正则表达式的内容括起来例1(正则创建,使用test()方法): <!DOCTYPE html> <html> <head> <me

JavaScript正则表达式知识汇总

Js 正则表达式知识汇总 正则表达式: 1.什么是RegExp?RegExp是正则表达式的缩写.RegExp 对象用于规定在文本中检索的内容. 2.定义RegExp:var +变量名=new RegExp(); 3.RegExp 对象有 3 个方法: 1)test()检索字符串中的指定值,返回值是true或false. var p1=new Reg("e"); document.write(Reg.test("welcome to China!")); 2)exec

DOM笔记整理

DOM是文档对象模型的简称,他的基本思想是把结构化的文档解析成一系列相互关联的树状节点.DOM不属于JavaScript的范围,但是操作DOM却是JavaScript中最常见的任务,所有的节点都有统一的对外规范以便能进行管理和操作.网上关于DOM的知识都比较零散,我也通过这些零散的知识自己进行统一消化和梳理,以下是我整理出来的学习笔记. 对于DOM的学习,我大致分成三步: 节点分类 , 节点访问 , 节点操作 ,我们在日常工作中涉及到的DOM几乎是这三步里面. 什么是节点? 节点(node)是D