JavaScript权威指南 正则表达式的模式匹配 读书笔记

来源:互联网 发布:上海淘宝模特兼职招聘 编辑:程序博客网 时间:2024/06/06 01:40
1.创建方式
var pattern = /s$/;

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



2.

如果不记得哪些标点符号需要反斜线转义,可以在每个标点符号前都加上反斜线。注意,许多字母和数字在有反斜线做前缀时也有特殊含义,所以对于想按照直接量进行匹配的字母和数字,尽量不要用反斜线对其转义。

3.


如/[\s\d]/匹配任意空白符或者数字。

4.

使用“*”和“?”时要注意,由于这些字符可能匹配0个字符,因此它们能允许什么都不匹配。例如,正则表达式/a*/与字符串“bbbb”匹配,因为这个字符串含有0个a。

5.分组:字符“|”用于分隔供选择的字符。如:/ab|cd|ef/可以匹配字符串“ab”,也可以匹配字符串“cd”或“ef”。
注意:选择项的尝试匹配次序是从左到右,直到发现了匹配项。如果左边的选择项匹配,就忽略右边的匹配项,即使它产生更好的匹配。因此,当正则表达式/a|ab/匹配字符串“ab”时,它只能匹配第一项a。


6.引用
正则表达式中圆括号的作用:
1.把单独的项组合成子表达式,以便可以像一个独立的单元那样用“|”,“*”,“+”或者“?”等来对单元内的项进行处理。如:/java(script)?/可以匹配字符串"java",其后可以有“script”也可以没有。
2.在完整的模式中定义子模式。同时正则表达式允许在同一正则表达式的后部引用前面的子表达式,通过在字符"\"后加一个或多个数字实现。这个数字指参与计数的左圆括号的位置。如
/([Jj]ava([Ss]cript)?)\sis\s(fun\w*)/ 中子表达式([Ss]cript) 可以用\2指代。
即从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。
注意:对正则表达式中前一个子表达式的引用,并不是指对子表达式模式的引用,而指与那个模式相匹配的文本的引用。如
/['"][^'"]*['"]/匹配位于单引号或双引号之内的0个或多个字符但它并不要求左侧和右侧的引号匹配,即它可匹配字符串“JavaScript‘
而/(['"])[^'"]*\1/则要求左侧和右侧的引号匹配,\1并不是子表达式模式的引用(['"]),而是指模式匹配的文本的引用。当字符串左侧是“,则它指的是”,当字符串是‘,则它指的是’。
注意:不能在字符串类中使用这种引用,如/(['"])[^\1]*\1/是非法。

7.


注意:\b与[\b]是完全不同的。


8.修饰符
修饰符"i"用以说明模式匹配不区分大小写。如/JavaScript/i可以匹配"javascript"
修饰符"g"说明模式匹配是全局的,也就是找出所有检索字符串所有的匹配。
修饰符"m"用以在多选模式中执行匹配,如果待检索字符串包含多行,那么^和$锚除了匹配整个字符串的开始和结尾外,还能匹配每行的开始和结尾。如/java$/im可以匹配"Java\nis fun"
9.用于模式匹配的String方法
1.search(),它的参数是一个正则表达式,返回第一个与参数匹配的子串的起始位置,如果没找到则返回-1;
"JavaScript".search(/script/i);返回4;
如果seacher的参数不是正则表达式,则首先通过RegExp构造函数将它转换为正则表达式。
注意:search()方法不支持全局检索,因为它忽略正则表达式参数的修改符g。


2.repalce()方法执行检索与替换操作。第一个参数是正则表达式,第二个参数是进行替换的字符串。如果正则表达式设置 了修饰符g,那么源字符串所有与模式匹配的子串将替换,否则只替换匹配的第一个子串。
注意:如果第一个参数是字符串而是正则表达式,则replace()将直接搜索这个字符串,则不是像search()这样先通过RegExp()将它转换为正则表达式。
如果在替换字符串中出现了$加数字,那么replace()将用于指定的子表达式相匹配的文本来替换这两字符。
如:"JavaScript is fun".replace(/(Java)Script/,"$1")结果是"JavaScript is fun",将$1指代的(Java)替换了"JavaScript"


3.match()方法,参数是一个正则表达式,返回一个由匹配结果组成的数组。
如果参数设置了修饰符g,则该方式包含字符串中所有匹配结果。如:
"JavaScript is fun,I love JavaScript".match(/(Java)Script/g)//返回['JavaScript','JavaScript'];
如果没有设置修饰符g,则返回数组中第一个元素是匹配的字符串,余下的元素则是正则表达式中用圆括号括起来的子表达式。如:
"JavaScript is fun,I love JavaScript".match(/(Java)Script/)//返回['JavaScript','Java']


4.split()方法,参数是字符串或正则表达式,使用参数作为分隔符将调用它的字符串拆分了一个子串组成的数组。
如:"1, 2, 3, 4, 5".split(/\s*,\s*/)//结果是["1","2","3","4","5"]
10.RegExp对象
注意:不论是字符串直接量还是正则表达式,都使用"\"字符作为转义字符的前缀,因此当给RegExp()传入一个字符串表述的正则表达式时,必须将"\"替换"\\"。RegExp()的第二个参数是可选的,它指定正则表达式的修饰符。如
var zipcode = new RegExp("\\d","g");//注意这时使用了"\\",而不是"\"
RegExp()构造函数非常有用,特别是在需要动态创建正则表达式时。

1.exec()方法,参数是一个字符串,如果没找到匹配,返回null,否则返回一个数组,数组第一个元素包含与正则表达式匹配的字符串,余下的元素是与圆括号内的子表达式相匹配的子串。数组属性index包含了发生匹配的字符位置,属性input则引用正在检索的字符串。
当调用exec()的正则表达式对象具有修饰符g时,它将把正则表达式对象的lastIndex属性设置为紧挨着匹配子串的字符位置。当同一正则表达式第二次调用exec()时,它会从lastIndex属性所指示的字符处开始检索。如果exec()没有发现任何匹配结果,它会将lastIndex重置为0.
注意:将使用RegExp对象开始对新的字符串查找之前,应当注意将lastIndex设置为0;
var pattern = /Java/g;
var text = "JavaScript is more fun than Java!";
var result;
while((result = pattern.exec(text)) != null){
alert("Mathed '" + result[0] + "' at position " + result.index + "; next search begins at " + pattern.lastIndex);
}


输出两次结果:1.Mathed 'Java' at position 0;next search begins at 4;
2.Mathed 'Java' at position 28;next search begins at 32;
注意一开始的RegExp对象为var pattern = /Java/;则陷入死循环,不断输出Mathed 'Java' at position 0;next search begins at 4;


2.test()方法与exec()方法等价,当exec()方法返回结果不是null时,test()返回true。同时,如果test()找到了一个匹配结果时,那么它就立即设置lastIndex为当前匹配子串的结束位置。可以使用test()来遍历字符串,就像用exec()方法一样。

0 0
原创粉丝点击