码迷,mamicode.com
首页 > 编程语言 > 详细

《Javascript权威指南》正则表达式

时间:2015-04-11 17:51:08      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:

直接量定义为包含在一对斜杠直接的字符串

var pattern = /s$/;

用构造函数RegExp()定义与之等价的正则表达式

var pattern = new RegExp("s$");

 

直接量字符

字符   匹配
字母和数字字符 自身
\o NUL字符
\t 制表符
\n 换行符
\v 垂直制表符
\f 换页符
\r 回车符

 

 

 

 

 

 

 

字符类

将直接量字符单独放进方括号就组成字符类。一个字符类可以匹配它包含的任意字符。

字符 匹配
[] 方括号内的任意字符
[^] 不在方括号内的任意字符
. 除换行符和其他Unicode行终止符以为的任意字符
\w [a-zA-Z0-9]
\W [^a-zA-Z0-9]
\s 任何Unicode空白符
\S 任何非Unicode空白符
\d [0-9]
\D [^0-9]
[\b] 退格直接量 

 

 

 

 

 

 

 

 

 

 

重复

字符 含义
{n,m} 匹配前一项至少n次,但不能超过m次
{n,} 匹配前一项n次或更多次
{n} 匹配前一项n次
? 匹配前一项0次或一次,等价于{0,1}
+ 匹配前一项一次或多次,等价于{1,}
* 匹配前一项0次或多次,等价于{0,}

 

 

 

 

 

 

 

非贪婪的重复

尽可能少地匹配

{n,m}?  ??   +?   *?

 

选择、分组和引用

选择      |

分组     ()   把单独的项合成子表达式   

       在完整的模式中定义子模式,当一个正则表达式成功和目标字符串匹配时,可以从目标串中抽出和圆括号的子模式相匹配的部分

                允许在同一正则表达式的后部引用前面的子表达式,\1引用的是第一个带圆括号的子表达式,位置是参与计算的左括号的位置。

 

对正则表达式前一个子表达式的引用指的是与那个模式相匹配的文本的引用。

/([‘"])[^‘"]*\1/ 

正则表达式不允许用双引号括起的内容中有引号,反之亦然。不允许在字符类中使用这种引用。

字符 含义
| 选择,匹配的是该字符左边还是右边的子表达式
() 组合,将几个项组合为一个单元,可以通过* ? + |修饰,而且可以记住和这个组合相匹配的字符串以供此后的引用使用
(?:) 只组合,把项组合到一个单元,不记忆与该项相匹配的字符
\n 和第n个分组第一次匹配的字符相匹配,组是圆括号的子表达式(可能是嵌套的),组索引从左到右的左括号,(?:形式的分组不编号

 

 

 

 

 

指定匹配位置

字符 含义
^ 匹配字符串的开头,多行检索中,匹配一行的开头
$ 匹配字符串的结尾,多行检索中,匹配一行的结尾
\b 匹配一个单词的边界,即字符\w和\W之间的位置。或位于字符\w和字符串的开头或结尾之间的位置([\b]匹配的是退格符)
\B 匹配非单词边界的位置
(?=p) 零宽正向先行断言,要求接下来的字符都与p匹配,但不能包括匹配p的那些字符
(?!p) 零宽负向先行断言,要求接下来的字符不与p匹配

 

 

 

 

 

 

/[Jj]ava([Ss]cript)?(?=\:)/可以匹配"Javascript: The Definitive Guide"中的"JavaScript",但不能匹配"Java in a Nutshell"的Java,因为后面没有引号

/Java(?! Script)([A-Z]\w*)/可以匹配"Java"后跟随一个大写字母和任意ASCII单词,但Java后面不能跟随"Script"。它可以匹配"JavaBeans",但不能匹配"Javanese",它可以匹配"JavaScript",但不能匹配"JavaScripter"

 

修饰符

字符     含义
i 执行不区分大小写的匹配
g 执行一个全局匹配,找到所有的匹配,不是在找到第一个后就停止
m 多行匹配模式,^匹配一行的开头和字符串的开头,$匹配行的结束和字符串的结束

 

 

 

 

修饰符放在/之外,可以任意组合。如想不区分大小写匹配字符串的一个单词"java",使用/\bjava\b/i,要匹配所有的单词,使用使用/\bjava\b/ig。

 

用于匹配模式的String方法

search()

参数是一个正则表达式,返回第一个与之匹配的子串的起始位置,如果找不到则返回-1。

如果search()的参数不说正则表达式,则首先会通过RegExp构造函数将它转换成正则表达式,search()不支持全局检索,会忽略正则表达式参数的g。

 

replace()

执行检索与替换操作。第一个参数是正则表达式,第二个参数是进行替换的字符串。

如果正则表达式设置了修饰符g,则源字符串所有与模式匹配的子串都替换成第二个参数指定的字符串,否则只替换第一个子串。

如果第一个参数是字符串而不是正则表达式,则直接搜索这个字符串。

如果再替换字符串中出现了$加数字,replace()将用与指定的子表达式相匹配的文本来替换这两个字符。

 

match()

返回一个由匹配结果组成的数组。如果正则表达式设置了修饰符g,该方法返回的数组包含字符串中的所有匹配结果。

"1 plus 2 equals 3".match(/\d+/g)  //返回["1", "2", "3"];

如果没有修饰符g,match()只检索第一个匹配,但依然返回一个数组,数组的第一个元素就是匹配的字符串,剩余的元素是正则表达式用圆括号括起来的子表达式。

var url = /(\w+):\/\/([\w.]+)\/(\S*)/;
var text = "visit my blog at http://www.example.com/~hehe";
var result = text.match(url);
if(result != null) {
    var fullurl = result[0];   //http://www.example.com/~hehe
    var protocol = result[1];  //http
    var host = result[2];      //www.example.com
    var path = result[3];      //~hehe
}

 

split()

将调用它的字符串拆分成一个子串组成的数组,使用的分隔符是split()的参数。

"1, 2, 3, 4, 5".split(/\s*,\s*/);    //返回["1", "2", "3", "4", "5"]

 

RegExp对象

RegExp的构造函数带有两个字符串参数,第二个参数可选。第一个参数包含正则表达式的主体,即//之间的文本。第二个参数指定修饰符。

需要动态创建正则表达式的时候需要用RegExp()构造函数。

RegExp属性

source:只读,包含正则表达式的文本

global:只读的布尔值,说明是否带修饰符g

ignoreCase:只读的布尔值,说明是否带修饰符i

multiline:只读的布尔值,说明是否带修饰符m

lastIndex:可读写整数,如果匹配模式带有g修饰符,这儿属性存储在整个字符串中下一次检索的开始位置

 

RegExp方法

exec()

对一个指定的字符串执行一个正则表达式,如果没有找到匹配返回null,如果找到一个匹配,返回一个数组。

这个数组的第一个元素是与正则表达式匹配的字符串,余下的元素是与圆括号内的子表达式匹配的子串。

属性index包含了发生匹配的字符位置,属性input引用的是正在检索的字符串。

 

test()

对某个字符串进行检测,如果包含正则表达式的一个匹配结果,则返回true

var pattern = /java/i;

pattern.test("JavaScirpt");  //true

 

当一个全局正则表达式调用方法test()时,它的行为和exec()相同,因为它从lastIndex指定的位置开始检索某个字符串,如果找到匹配结果,立即设置lastIndex为当前匹配子串的结束位置。就可以使用test()来遍历字符串,就像用exec()方法一样。

 

《Javascript权威指南》正则表达式

标签:

原文地址:http://www.cnblogs.com/surahe/p/4411574.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!