您的位置:首页 > Web前端 > JavaScript

javascript正则表达式(RegExp类型)

2014-02-28 14:34 274 查看

简介

javascript中用RegExp类型来表示正则表达式。正则表达式强大的匹配模式能用于检索与替换。

正则表达式定义

在javascript中,正则表达式的定义也有两种方式,第一种是使用正则表达式字面量;第二种是使用构造函。

在具体介绍怎么定义前,先介绍下正则表达式的修饰符,它用以说明匹配模式的规则。

正则表达式有三个修饰符,分别是:

i,表示不区分大小写;
g,表示全局匹配;
m,表示多行匹配

然后我们就可以一起来看看,正则表达式是怎样结合修饰符来定义的了:

//字面量定义,且不带修饰符
var pattern1=/at/;

//字面量定义,带修饰符
var pattern2=/at/g;

//字面量定义,带多个修饰符
var pattern3=/at/gi;

//构造函数定义,不带修饰符
var pattern4=new RegExp("at");

//构造函数定义,带修饰符
var pattern5=new RegExp("at","i");

//构造函数定义,带多个修饰符
var pattern6=new RegExp("at","gi");
由上面可以看出,正则表达式字面量通过一对斜杆(/)以及斜杆间包含的字符所组成的,如果有修饰符,则跟在第二个斜杆后面;用构造函数的方法,是通过new 跟RegExp()函数来完成的,该函数有两个参数,第一个参数是用字面量定义时,包含在斜杆直接的字符串,第二个参数是修饰符。

注意,可以同时使用多个修饰符。

知道了怎么定义正则表达式之后,接下来要介绍的就是,之前提到的在斜杆间的字符串是怎么表示的,它们有哪些含义。

字符匹配

下面的表格,列出了正则表达式的字符,已经它所匹配的内容:

字符匹配
直接量字符
字母和数字自身
\oNUL字符(\u0000)
\t制表符(\u0009)
\n换行符(\u000A)
\v垂直制表符(\u000B)
\f换页符(\u000C)
\r回车符(\u000D)
\xnn由十六进制数nn指定额拉丁字符
\uxxxx由十六进制xxxx指定的Unicode字符
\cX控制字符^X
字符类
[...]方括号内的任意字符
[^...]不在方括号内的任意字符
.除换行符和其他Unicode行终止符之外的任何字符
\w等价于[a-zA-Z0-9]
\W等价于[^a-zA-Z0-9]
\s任何Unicode空白符
\S任何非Unicode空白符的字符,与\w不同
\d等价于[0-9]
\D等价于[^0-9]
[\b]退格直接量
重复
{n,m}匹配前一项至少n次,但是不超过m次
{n,}匹配前一项n次,或者更多次
{n}匹配前一项n次
?匹配前一项0次或者1次,等价于{0,1}
+匹配前一项1次或者多次,等价于{1,}
*匹配前一项0次或者多次,等价于{0,}
非贪婪的重复(尽可能少的匹配)
在匹配的字符后多跟一个?比如/a+?/,将‘aaaa’作为匹配字符,它将只匹配一个a
选择、分组和引用字符
|选择,匹配的是改字符左边的子表达式或右边的字表达式
(...)组合,将几个项组合为一个单元,这个单元可以通过其他符号加以修饰。并且,可以记住这个组合所匹配的字符串。
(?:...)只组合,不记忆与该组相匹配的字符串
\nn是一个数字,如\1。表示与第n个分组第一次匹配的字符相匹配。组的索引是从左到有的左括号数。"(?:"形式的分组不算
锚字符
^匹配字符串的开头,在多行检索中,匹配一行的开头
$匹配字符串的结尾,在多行检索中,匹配一行的结尾
\b匹配一个单词的边界
\B匹配非单词边界的位置
(?=p)要求接下来的字符都与p匹配,但是不能包括匹配p的那些字符
(?!p)要求接下来的字符都不与p匹配

用于模式匹配的String方法

String对象中,有几个方法可以用于正则表达式模式匹配。它们分别是:search()、replace()、match()和split()。

search()

search()方法的参数是一个正则表达式(如果传入的不是正则表达式,它也会将其转换为正则表达式),返回第一个与之匹配的子串的起始位置,如果找不到匹配的子串,则返回-1。该方法不支持全局检索。

var text="Javascirpt不是java!";
alert(text.search(/java/i)); //0
alert(text.search(/java/));  //12
alert(text.search(/javas/)); //-1
注意:search()方法虽然不支持全局检索,但是支持其他两个修饰符(i,m)。

replace()

replace()方法用于替换检索字符串。它有两个参数,第一个参数是正则表达式(如果不是正则表达式,则自己搜索传入的字符串,不会将其转为正则表达式),第二个参数是要替换的字符串。在默认情况下,替换所匹配的第一个子串。当设置了全局修饰符,则替换字符串中所有匹配的子串。返回替换后的字符串。

var text="javascirpt不是java!";
alert(text.replace(/java/,"Java")); //Javascirpt不是java!
alert(text.replace(/java/g,"Java")); //Javascirpt不是Java!
alert(text); //javascirpt不是java!


match()

match()方法只有一个参数,它是一个正则表达式(如果不是正则表达式,也会将其转换为正则表达式)。返回一个由匹配结果组成的数组。如果传入的正则表达式没有带g修饰符,那么只检索第一个匹配;如果有带g修饰符,则返回所有匹配的结果。

var text="1+2=3;"
alert(text.match(/\d/g)); //1,2,3
alert(text.match(/\d/)); //1
我们再来看另一个例子:

var text="javascriptJavascript"
alert(text.match(/([jJ]ava)script/g)); //javascript,Javascript
alert(text.match(/([jJ]ava)script/));  //javascript,java
alert(text.match(/javascript/)); //javascript
上面这个例子分别测试检索了带有分组字符的正则表达式,全局检索和非全局检索的情况。第一个alert是全局检索,跟我们预期的一样,它匹配的是javascript和Javascript;第二个alert没有设置全局修饰,所以它只检索第一个匹配,那么应该是javascript,可是结果数组中却出现java,这是为什么呢?原因是,虽然match()执行的不是全局检索,但是它返回的也是一个数组,数组第一个元素存放完整的匹配,从第二个结果开始,就依次存放与分组匹配的字串。如果没有分组,则直接检索第一个匹配。

split()

split()方法可以将调用它的字符串拆分为子串组成的数组。它有一个参数,即要使用的分隔符。

var text="1, 2, 3, 4, 5";
alert(text.split(/\s*,\s*/)); //1,2,3,4,5
alert(text.split(','));  //1, 2, 3, 4, 5
上面这个例子,分别用两种方式将字符串转换为了数组。注意两个的区别。第一个是使用正则表达式,分隔符是前后有0个或多个空格符的逗号,它返回的数组元素是不带空格的;第二个是使用逗号分隔,它返回的数组元素中前四个后面都带有空格。

RegExp的方法

RegExp对象有两个用于执行模式匹配操作的方法,分别是exec()和test()。

exec()

这个方法对一个指定的字符串执行一个正则表达式。它有一个参数,被指定检索的字符串。执行该方法时,如果找到了一个匹配,那么它将返回一个数组,与match()方法执行非全局检索一样。如果它没有找到匹配,将返回null。注意,不管正则表达式有没有设置全局属修饰,exec()返回的结果都是一样的,这点与match()不一样。来看一个例子:

var text="javascriptJavascript"
var pattern1=/([jJ]ava)script/g;
var pattern2=/([jJ]ava)script/;
var pattern3=/javascript/;

alert(pattern1.exec(text));  //javascript,java
alert(pattern2.exec(text));  //javascript,java
alert(pattern3.exec(text));  //javascript
pattern1与pattern2唯一的区别是一个设置了全局修饰而另一个没有。但是他们的返回结果是一样的。pattern3没有分组字符,所以就只返回一个匹配。

这个结果数组还有两个属性,第一个是index属性,包含了发生匹配的字符位置;第二个属性是input属性,指向正则检索的字符串,如:

var text="javascriptJavascript"
var pattern1=/([jJ]ava)script/;
var result=pattern1.exec(text);

alert(result.index); //0
alert(result.input); //javascriptJavascript


test()

test()方法的参数也是一个字符串,它也将对传入的参数进行检索,如果包含正则表达式的一个匹配结果,就返回true。

var text="javascriptJavascript"
var pattern1=/([jJ]ava)script/;
alert(pattern1.test(text)); //true
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息