正则表达式

四、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],在调用的时候可以直接用点访问法。

posted @ 2017-03-19 16:51  某个润滑君  阅读(245)  评论(0编辑  收藏  举报