正则表达式
四、RegExp类型(正则表达式)
1.创建正则表达式的方法:
字面量形式:
var expression=/pattern/flags;
其中,pattern是任意的简单或是复杂的正则表达式,而flags则表示正则表达式的匹配模式,正则表达式的匹配模式包括以下三种
g:表示全局模式(global),意思是该正则表达式应用于所有的字符串,而不是说发现第一个匹配项时立即停止匹配。
i:表示不区分大小写模式(cas,e-insensitive),在确定匹配项的时候会忽略掉模式与字符串的大小写
m:表示多行模式(multiline),当在该行字符串中找不到匹配的字符串时,将会自动在下一行字符串中匹配
*要注意的是,以上的匹配模式都是可以搭配使用的,不是必须单独存在。
RegExp()构造函数形式:
该函数接受两个参数:一个是正则表达式,另一个则是匹配模式,例如:
var pattern2=new RegExp("[bc]at","i");
由于传递给该构造函数的参数都是字符串,所以在某些情况下要对字符串静心双重转义,对于已经转义过的字符也是如此,例如\n则会变为\\\\n.
2.元字符:
正则表达式中包括两种类型的字符:普通字符还有元字符。其中普通字符的意思就是指数字和字母这些字符。而元字符也就是一类特殊字符:
(1)\d 匹配数字,相当于[0-9]
(2)\D 匹配非数字,相当于[^0-9]
(3)\s 匹配空白符,例如空格,制表符,换行符等等
(4)\S 匹配非空白符
(5)\w 匹配字母,下划线,数字,汉字
(6)\W 匹配除字母,下划线,数字,汉字之外的字符
(7). 匹配除了换行符以外的字符
(8)[...] 匹配方括号的任一字符,[123]就是匹配一到三任意一个数字
(9)[^...] 匹配方括号内之外的所有字符
eg:
var expression=/0\d{2}-\d{8}/i;
表示的是匹配中国的电话号码,首先第一个是0,然后是两个数字,然后是“-”,然后是8个数字
3.连接字符:表示从什么到什么,如[0-9],表示从0到9
4.限定符:限定某个字符的出现次数
(1)+ 重复1次或是更多次
(2)* 重复0次或是更多次(任意次数)
(3)? 重复0次或1次(最多1次)
(4){n} 重复n次
(5){n,}重复n次或更多次(最少n次)
(6){n,m}重复n到m次
5.定位符:限定字符出现的位置
(1)^ 限定开头字符
(2)$ 限定结尾字符
(3)\b 限定单词(字)边界字符
eg:er\b,匹配order to中er,而不匹配verb中的er
(4)\B 限定非单词(字)边界字符
eg:\ba[a-z]{7}\b,匹配一个以a开头的长度为8的单词,因为\b限定了单词的开始和结束
6.转义字符
在正则表达式中有一些特殊符号会代表一些特定含义,但有时候我们会希望匹配这些特殊字符而不是使用它们的含义,这时候就需要使用转义字符“\”
对于用字面量创建的正则表达式,要匹配“^a”,我们只要在^定位符前加一个"\"就可以了,但是在利用构造函数RegExp时,就需要双重转义"\\"。这是转移字符需要注意的一点。而且对于"\"的转义,字面量法是"\\",构造函数法是"\\\\"。
7.分组符
也就是我们说的捕获组或者说是子表达式,分组符就是左括号和右括号“()”。
8.选择符“|”,用于选择匹配模式中的任意一个的意思,常常和分组符结合使用
eg:”(h|H)a”,匹配ha或者Ha
8.正则表达式注释
语法:
(?#注释内容)
9.实例方法
(1)text方法,该方法会返回一个布尔值,在模式与该参数匹配的时候返回true,否则返回false
var text="000-00-0000"; var pattern=/\d{3}-\d{2}-\d{4}/; if(pattern.text(text)){ alert("The pattern was matches."); }
10.exec()
exec是正则表达式里最主要的一个方法了,该方法接收一个参数,就是要要应用模式的字符串,然后返回包含第一个匹配项信息的数组,或者没有匹配项的情况下返回null。在有分组符的情况下,第一项是与整个模式匹配的字符串,其他项则是与模式中的捕获组匹配的字符串。其中返回的这个数组具有额外的两个属性,index和input;index是指第一项匹配的字符串的索引位置,input则是表达应用了正则表达式的字符串,也就是我们要匹配的整个字符串。
var text=“mom and dad and baby”; var pattern=/mom( and dad( and baby)?)?/gi; var matches=pattern.exec(text); alert(matches.index); //0 alert(matches.input); //"mom and dad and baby" alert(matches[0]); //"mom and dad and baby" alert(matches[1]); //"and dad and baby" alert(matches[2]); //"and baby"
*对于全局模式来说,正则表达式在第一次找到了匹配项之后,还会继续查找新的匹配项。但是即便如此exec方法还是依旧只是返回一个匹配项。在设置全局标志的情况下面,每次调用exec方法都会在字符串中继续查找新匹配项,每一次lastIndex属性都会返回字符串中下一个匹配项。而如果不设置全局标志的情况下,每一次都是始终返回第一个匹配项的信息,所以lastIndex属性会一直不变。
另外,正则表达式中字面朗始终是会共享同一个RegExp实例,而使用构造函数创建的每一个新的RegExp实例都是一个新实例。如:
var re=null, i; for(i=0;i<10;i++){ re=/cat/g; re.text("catastrophe"); } for(i=0;i<10;i++){ re=new RegExp("cat","g"); re.text("catastrophe"); }
由于第一个循环体中使用的是字面量,所以每一次调用text都会从上一次的索引开始查找,得到的结果就会有所不同。而第二个则是每次都会创建一个新的实例,所以每次调用都会返回true
11.RegExp实例属性
(1)global:布尔值,表示是否设置了g标志
(2)ignoreCase:布尔值,表示是否设置了i标志
(3)lastIndex:整数,表示开始搜索下一个匹配项的字符位置,从0算起
(4)multline:布尔值,表示是否设置了m标志
(5)source:正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回
12.RegExp构造函数属性
这些属性有两种访问方式:长属性名方式和短属性名方式。并且对于Opera浏览器来说,它并不支持input、lastMatch、lastParen和multiline属性
(1)input($_):最近一次要匹配的字符串
(2)lastMatch($&):最近一次的匹配项
(3)lastParen($+):最近一次匹配的捕获组
(4)multiline($*):布尔值,表示是否所有表达式都是用多行模式
(5)rightContent($'):Input字符串中lastMatch之后的文本
(6)leftContent($`):Input字符串中lastMatch之前的文本
var text="this has been a short summer"; var pattern=/(.)hort/g; if(pattern.test(text)){ alert(RegExp.input);//"this has been a short summer" alert(RegExp.leftContext);//"this has been a " alert(RegExp.rightContext);//"summer" alert(RegExp.lastMatch);//"short" alert(RegExp.lastParen);//"s" alert(RegExp.multiline);//"false" }
/*
短属性名使用:
if(pattern.test(text)){ alert(RegExp.$_);//"this has been a short summer",使用点访问法说明“_”是有效的标识符 alert(RegExp.["$`"]);//"this has been a " alert(RegExp.["$'"]);//"summer" alert(RegExp.["$&"]);//"short" alert(RegExp.["$+"]);//"s" alert(RegExp.["$*"]);//"false" }
*/
*除了上述几个属性之外,还有多达九个用于存储捕获组的构造函数属性。语法:$[1-9],在调用的时候可以直接用点访问法。