正则表达式(regular expression)是一个描述字符模式的对象。javascript的RegExp类表示正则表达式,string和RegExp都定义了方法,后者使用正则表达式进行强大的模式匹配和文本检索与替换功能。javascript的正则表达式,是perl5的正则表达式语法的大型子集。
javascript的正则表达式用RegExp表示,可以使用RegExp()构造函数来创建RegExp对象,不过RegExp对象更多是通过一种特殊的的直接量语法来创建。就像通过引号包裹字符的方式来定义字符串直接量一样,正则表达式直接量定义为包含在一对斜杠(/)之间的字符,例如
var pattern = /s$/;
运行这段代码创建一个新的RegExp对象,并将它赋值给pattern。用构造函数也可以定义与之等价的正则表达式
var pattern = RegExp("s$");
1. 字符类
[...] 表示方括号内的任意字符 [^...] 表示不在方括号内的任意字符 . 除换行符和其他Unicode行终止符之外的任意字符 w 任何ASCII字符组成的单词,等价于[a-zA-Z0-9] W 任何不是ASCII字符组成的单词,等价于[^a-zA-Z0-9] s 任何Unicode空白符 S 任何非Unicode空白符 d 任何ASCII数字,等价于[0-9] D 任何非ASCII数字,等价于[^0-9] [] 退格直接量
2. 重复
{n,m} 匹配前一项至少n次,但不能超过m次 {n,} 匹配前一项n次或更多次 {n} 精确匹配前一项n次 ? 匹配前一项0次或者1次,等价于{0,1} + 匹配前一项1次或更多次,等价于{1,} * 匹配前一项0次或更多次,等价于{0,}
3. 正则表达式的选择,分组和引用字符
| 选择,匹配的是该符号左边的子表达式或右边的子表达式 (...) 组合,将几项组合为一个单元,这个单元可以通过“*”,“+”,“?”,“|”等符号加以修饰,而且可以记住和这个组合相匹配的字符串以供以后的引用使用 (?:...) 只组合,把项组合到一个单元,但不记忆与该项相匹配的字符 和第n个分组第一次匹配的字符相匹配,组是圆括号中的子表达式(也有可能是潜嵌套的),组索引是从左到右的左括号数,“(?:”形式的分组不编码
4. 正则表达式中的锚字符
^ 匹配字符串的开头,在多行检索中,匹配一行的开头 $ 匹配字符串的结尾,在多行检索中,匹配一行的结尾 匹配一个单词的边界 B 匹配非单词的边界 (?=p) 零宽正向先行断言,要求接下来的字符都与p匹配,但不能包括匹配p的那些字符 (?!p) 零宽负向先行断言,要求接下来的字符不与p匹配
5. 正则表达式的修饰符
i 执行不区分大小写的匹配
g 执行一个全局匹配,简言之,即找到所有的匹配,而不是在找到第一个之后就停止
m 多行匹配模式,^匹配一行的开头和字符串的开头,$匹配行的结束和字符串的结束
6. 正则表达式用于模式匹配的string方法
string支持4种正则表达式的方法。
1. search():他的参数是一个正则表达式,返回第一个与之匹配的字符串起始位置,如果找不到匹配的字符串,则返回-1;如果search()的参数不是正则表达式,则会首先调用Regexp的构造函数,将它转换为正则表达式,search()不支持全局检索,因为他忽略正则表达式修饰符g。
例:’javascript‘.search(/script/i);
2. replace(): 用以执行检索和替换操作其第一个参数是正则表达式,第二个参数是要进行替换的字符串。如果正则表达式设置了修饰符g,则进行全局检索并替换,如果不设置g,则只替换查找到的第一项。如果replace()的第1个参数是字符串而不是正则表达式,则replace()将直接搜索这个字符串,而不是想serrach()一样,首先通过RegExp(),将它转换为正则表达式。
例:var text = ’php css html javascript‘;
text.replace(/javascript/gi,'JavaScript'); //将text中的javascript替换为JavaScript。
3. match(): 是最常用的string正则表达式方法。他的唯一参数是一个正则表达式。返回的是一个有匹配结果组成的数组。如果设置了修饰符g,则该方法返回的数组中包含字符串中的所有匹配结果。
例:"1 plus 2 plus 3".match(/d+/g); // 返回['1','2','3']
如果没有修饰符g,match()不会进行全局检索,他之检索第一个匹配,这时也返回一个数组,在这种情况下,数组的第一个元素就是匹配的字符串。余下的元素是正则表达式中,用圆括号括起来的子表达式的匹配的子字符串。此时match()方法和RegExp的exec()方法一样。
4. split(): 该方法将调用他的字符串拆分一个子串组成的数组,使用的分隔符是split()的参数。split()方法的参数也可以时一个正则表达式。
例:"abc,def,ghj".split(','); // 返回['abc','def','ghj']
7 RegExp对象
RegExp()构造函数带有两个字符串参数,其中第二个是可选的,RegExp()用以创建新的RegExp对象。第一个参数包含正则表达式的主体部分,也就是正则表达式中直接量中两条斜线之间的文本。不论是直接量还是正则表达式的,都是用’‘作为字符串转义字符的前缀。第二个参数是正则表达式的修饰符,只能传入g,i,m或他们的组合。
例:var zipcode = RegExp("\d{5}","g");
RegExp的属性
1. source:包含正则表达式的文本
2. global:布尔值,说明正则表达式是否带有修饰符g
3. ignoreCase:布尔值,说明是否带有修饰符i
4. multiLine:布尔值,说明是否带有修饰符m
5. lastIndex:可读写的整数,如果匹配模式带有修饰符g,这个属性存储 在字符串中下一次检索的开始位置,这个属性会被exec()和test()方法用到
RegExp方法
1. exec() 和match()方法没有修饰符g一样
2. test() 他的参数是一个字符串,用test()对某个字符串进行检测,如果包含正则表达式的一个匹配结果,则返回true。