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()函数来完成的,该函数有两个参数,第一个参数是用字面量定义时,包含在斜杆直接的字符串,第二个参数是修饰符。
注意,可以同时使用多个修饰符。
知道了怎么定义正则表达式之后,接下来要介绍的就是,之前提到的在斜杆间的字符串是怎么表示的,它们有哪些含义。
字符匹配
下面的表格,列出了正则表达式的字符,已经它所匹配的内容:字符 | 匹配 |
---|---|
直接量字符 | |
字母和数字 | 自身 |
\o | NUL字符(\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 |
选择、分组和引用字符 | |
| | 选择,匹配的是改字符左边的子表达式或右边的字表达式 |
(...) | 组合,将几个项组合为一个单元,这个单元可以通过其他符号加以修饰。并且,可以记住这个组合所匹配的字符串。 |
(?:...) | 只组合,不记忆与该组相匹配的字符串 |
\n | n是一个数字,如\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)); //javascriptpattern1与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
相关文章推荐
- JavaScript基础——引用类型(二)日期类型Date、正则表达式类型RegExp
- javascript类型系统_正则表达式RegExp类型详解
- 【JavaScript】RegExp 类型正则表达式
- ES引用类型 之 Regexp正则表达式(摘至javaScript 高程3)
- JavaScript引用类型之RegExp类型(正则表达式)
- JavaScript正则表达式----RegExp类型, 代码说明简单易懂
- JavaScript 1.10 RegExp类型—正则表达式的使用方法(部分转载)
- javascript类型系统_正则表达式RegExp类型详解
- 详解JavaScript正则表达式之RegExp对象
- JavaScript 正则表达式对象RegExp test方法慎用/g
- JavaScript 正则表达式RegExp(text方法/内部类/边界/量词/优先级/replace/trim)
- JavaScript语法入门系列(七) 类和对象(正则表达式RegExp)
- JavaScript-RegExp 正则表达式
- Javascript 正则表达式 RegExp
- JavaScript RegExp 正则表达式
- JavaScript 正则表达式(RegExp对象、属性、方法、String支持)
- JavaScript RegExp(正则表达式) 对象
- 正则表达式学习-JavaScript RegExp 对象
- JavaScript正则表达式 RegExp
- js--引用类型RegExp--验证中文正则表达式