JS_正则表达式模式匹配

215 阅读3分钟

一.正则表达式的定义
1.直接量字符
*需要转义的加"\",不需要的直接使用自身字符
\t ,\n,\r,\f-换页符,字母和数字字符-自身


2.字符类
[...]  方括号内的任意字符
[^...] 不在方括号内的任意字符
.   除换行符和其他Unicode行终止符之外的任意字符
\w  任何ASCII字符组成的单词,等价于[a-zA-Z0-9]
\s  任何Unicode空白符
\d  任何ASCII数字,等价于[0-9]
[\b] 退格直接量(特例)


3.重复
{n,m}  匹配前一项至少n次,但不能超过m次
{n,}   匹配前一项n次或者更多次
{n}    匹配前一项n次
?    匹配前一项0次或者1次
+     匹配前一项1次或者多次
*     匹配前一项0次或者多次


4.选择、分组和引用字符
|      选择的是该符号左边的子表达式或右边的子表达式
(...) 组合,将几个项组合为一个单元,这个单元可通过"*"、"+"、"?"和"|"等符号加以修饰,而且可以记住和这个组合相匹配的字符串以供伺候的引用使用
(?:...) 只组合,把项组合到一个单元,但不记忆与该组相匹配的字符
\n  和第n个分组第一次匹配的字符相匹配,组是圆括号的子表达式,组索引是从左到右的左括号,"?:"形式的分组不编码


5.锚字符
^  匹配字符串的开头在多行检索中,匹配一行的开头
$  匹配字符串的结尾,在多行检索中,匹配一行的结尾
\b 匹配一个单词的边界
(?=p)  零宽正向先行断言,要求接下来的字符都与p匹配,但不能包括匹配p的那些字符
(?!p)  零宽负向先行断言,要求接下来的字符都不与p匹配


6.修饰符
i  执行不区分大小写的匹配
g  执行一个全局匹配,简言之,即找到所有的匹配,而不是在找到第一个之后就停止
m  多行匹配模式,^匹配一行的开头和字符串的开头,$匹配行的结束和字符串的结束


二.用于模式匹配的String方法
1.Search()。参数是一个正则表达式(不是,则首先会通过RegExp构造函数将它转换为正则表达式,不支持全局检索),返回第一个与之匹配的子串的起始位置,若无,则返回-1.
"JavaScript".search(/script/i);  //4


2.replace()。执行检索与替换操作。
text.replace(/jacascript/gi,"JavaScript"); //将所有不区分大小写的javascript都替换成大小写正确的JavaScript


3.match()。最常用的String正则表达式。它的唯一参数就是一个正则表达式,返回的是一个有匹配结果组成的数组。
"1 plus 2 equals 3".match(/\d+/g) //返回["1","2","3"]


//解析一个URl
var url = /(\w+):\/\/([\w.]+)\/(\S*)/;
var text = "Visit my blog at www.example.com/~david";
var result = text.match(url);
if(result != null){
var fulurl = result[0];// 包含"http:www.exaple.com/!david";
var protocol = result[1]; //包含"http;
var host = result[2]; //包含"www.example.com"
var path = result[3]; //包含"~david"
}


4.exec()。给字符串的match()传入一个非全局的正则表达式,实际上两者一样。


5.split()。拆分为一个子串组成的数组。
"123,456,789".split(","); //返回["123","456","789"]


三.RegExp对象
RegExp()构造函数带有两个字符串参数,其中第二个参数是可选的,RegExp()用于创建新的RegExp对象。第一个参数包含正则表达式主体部分,必须将"\"替换成"\".RegExp()的第二个参数可选,只能传入g、i、m或者它们的组合。
var zipcode = new RegExp("\\d{5}","g");


1.RegExp的属性(5个)。
*source是一个只读的字符串,包含正则表达式的文本。
*global是一个只读的布尔值,用于说明这个正则是否带有修饰符g。
*ignoreCase是一个只读的布尔值,用于说明正则表达式是否带有修饰符i。
*multiline是一个只读的布尔值,用于说明正则表达式是否带有m。
*lastIndex是一个可读/写的整数。如果匹配模式带有g修饰符,这个属性存储在整个字符串中下一次检索的开始位置。(在exec()和test()方法中用到)。


2.方法
//反复调用exec()
var pattern = /Java/g;
var text = "JavaScript is more fun than Java!";
var result;
while((result = pattern.exec(text))!=null){
alert("Matched '"+result[0]+"'"+" at position " + result.index+ ";next search begins at "+pattern.lastIndex);
}


//test()
var pattern /java/i;
pattern.test("JavaScript"); //返回true