正则表达式的定义
定义正则表达式有两种方式,第一种是使用正则表达式直接量定义,还有一种就是通过正则表达式的构造函数定义。
直接量定义正则
一个正则表达式直接量会在执行到它时转换为一个RegExp对象,ECMAScript 5规定,同一段代码所表示的正则表达式直接量量的每次运算都返回新对象。
// 正则表达式直接量定义
// 格式:"/正则表达式主体/模式"
var reg = /^Java/i; //匹配以"Java"开头的字符串
构造函数定义正则
直接用正则表达式的构造函数(RegExp)定义正则,第一个参数是正则表达式主体,第二个参数可选表示模式
var reg = new RegExp("^Java","i");
正则表达式中的直接量
字符类
重复
非贪婪重复
假设字符串为”aaa”,正则表达式为/a+/,将会全部匹配。现在我们试试非贪婪匹配的版本/a+?/,则只会匹配”a”。
选择、分组和引用
指定匹配位置
修饰符
用于模式匹配的String方法
search()
如果匹配成功返回第一个与之匹配字符串的位置,如果找不到将返回-1。
"JavaScript".search(/script/i);
replace()
第一个参数是正则表达式,第二个参数是替换的字符串。
var text = "javascript";
text.replace(/javascript/gi, "JavaScript");
正则表达式会记忆与每个子表达式匹配的文本,如果替换字符串中出现了$加数字,那么repace()将会用于指定的字表达式相匹配的文本来替换着两个字符。
// 用中文引号替换英文引号
text.repace(/"(^")*"/g, '“$1”');
match()
如果正则表达式设置了修饰符g,match()会进行全局检索找到所有与之相匹配的字符串。
var text = "java JavaScript";
text.match(/java/i); //返回["java", "Java"];
如果没设置修饰符g,match只检索第一个想匹配。但即使match()执行的不是全局索引,它也返回一个数组。第一个元素就是匹配的字符串,余下的元素则是正则表达式中用圆括号括起来的自表达式。
var text = "abcd12345";
text.match(/(\w+)(\d)+/); //返回["abcd12345", "abcd", "12345"]
split()
var text = "1, 2, 3";
text.split(/\s*,\s*/); //返回["1","2","3"]
RegExp对象
RegExp的属性
- source
- global
- ignorecase
- multiline
- lastIndex
source是一个只读字符串,包含正则表达式的文本。
global是一个只读布尔值,说明正则表达式是否带有修饰符g
ignorecase是一个只读布尔值,说明正则表达式是否带有修饰符i
multiline是一个只读布尔值,说明正则表达式是否带有修饰符m
lastIndex是一个可读/可写的整数。
RegExp的方法
exec()
exec()总是返回一个匹配结果,并提供关于本次匹配的完整信息。当调用exec()的正则表达式具有修饰符g时,它将会把当前正则表达式的lastIndex属性设置为紧挨着匹配字符串的字符位置。当第二次调用exec()时,它从lastIndex属性所指示的字符开始检索。如果exec()没有发现任何匹配结果,它会将lastIndex重置为0.
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()
调用test()和调用exec()等价,当exec()的返回值不是null时,test()返回true。当一个全局正则表达式调用方法test()时,它的行为和exec()相同。