正则表达式是一个描述字符模式的对象。JavaScript的RegExp类表示正则表达式,String和RegExp都定义了方法,后者使用正则表达式进行强大的模式匹配和文本检索与替换功能。
JavaScript中的正则表达式用RegExp对象表示,可以使用RegExp()构造函数来创建RegExp对象,不过RegExp对象更多的是通过一种特殊的直接量语法来创建。正则表达式直接量定义为包含在一对斜杠(/)之间的字符,如:
var pattern=/s$/;
运行这段代码创建一个新的RegExp对象,并将它赋值给变量pattern。这个特殊的RegExp对象用来匹配所有以字母“s”结尾的字符串。用构造函数RegExp()也可以定义一个与之等价的正则表达式,代码如下:
var pattern = new RegExp("s$");
ECMAScript 3规范规定,一个正则表达式直接量会在执行到它时转换为一个RegExp对象,同一段代码所表示正则表达式直接量的每次运算都返回同一个对象。
1 直接量字符
在正则表达式中可以使用本身来表示字符,例如所有的字母和数都是按照字面意思进行匹配的,但是也并非完全如此,例如换行符、回车符这些只能够使用转义字符表示,也就是以反斜杠(\)为前缀进行转义,例如\n表示换行符、\t表示制表符等等。
正则表达式中直接量列表如下:
2 字符类
一个字符类可以匹配它所包含的任意字符。因此,正则表达式/[abc]/就和字母"a"、"b"、"c"中的任意一个都匹配。另外,可以通过"^"符号来否定字符类,它匹配所有不包含在方括号内的字符。
正则表达式的字符类:
我们在正则模式之后跟随用以指定字符重复的标记。由于某些重复种类非常常用。因此就有一些专门用于表示这种情况的特殊字符。如,"+"用以匹配前一个模式的一个或多个副本。下面总结一下这些表示重复的正则语法。
正则表达式的重复字符语法:
注意:
在使用"*"和“?”时要注意,由于这些字符可能匹配0个字符,因此它们允许什么都不匹配。如,正则表达式/a*/实际上与字符串"bbbb"匹配,因为这个字符串含有0个a。
非贪婪的重复
贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配。如下面使用模式p匹配字符串str,结果就是匹配到:abcaxc(ab*c)。
非贪婪匹配:就是匹配到结果就好,就少的匹配字符。如上面使用模式p匹配字符串str,结果就是匹配到:abc(ab*c)。
如:String str="abcaxc";
Patter p="ab*c";
4 选择、分组和引用正则表达式的语法还包括指定选择项、子表达式分组和引用前一子表达式的特殊字符。
注意,选择项的尝试匹配次序是从左到右,直到发现了匹配项。如果左边的选择项匹配,就忽略右边的匹配项,即使它产生更好的匹配。因此,当正则表达式/a|ab/匹配字符串“ab”时,它只能匹配第一个字符。
正则表达式的选择、分组和引用字符:
5 修饰符
正则表达式的修饰符,用以说明高级匹配模式的规则。和之前讨论的正则表达式语法不同,修饰符是放在"/"符号之外的,也就是说,它们不是出现在两条斜线之间,而是第二条斜线之后。
正则表达式修饰符:
6 用于模式匹配的String()方法
String()支持4种使用正则表达式的方法。
- search()
- replace()
- match()
- split()
参数:
stringObj 必选项。要在其上进行查找的 String 对象或字符串文字。
rgExp 必选项。包含正则表达式模式和可用标志的正则表达式对象。 说明:如果找到则返回子字符至开始处的偏移位,否则返回-1。
例子:
function SearchDemo(){结果: r:18;r2:-1
var r, re; // 声明变量。
var s = "The rain in Spain falls mainly in the plain.";
re = /falls/i; // 创建正则表达式模式。
re2 = /tom/i;
r = s.search(re); // 查找字符串。
r2 = s.search(re2);
return("r:" + r + ";r2:" + r2); // 返回 Boolean 结果。
}
console.log(SearchDemo());
2)replace 方法
返回根据正则表达式进行文字替换后的字符串的复制。
语法:tringObj.replace(rgExp, replaceText)
参数:stringObj 必选项。要执行该替换的 String 对象或字符串文字。该字符串不会被 replace 方法修改。
rgExp 必选项。为包含正则表达式模式或可用标志的正则表达式对象。也可以是 String 对象或文字。如果 rgExp 不是
正则表达式对象,它将被转换为字符串,并进行精确的查找;不要尝试将字符串转化为正则表达式。
replaceText 必选项。是一个String 对象或字符串文字,对于stringObj 中每个匹配 rgExp 中的位置都用该对象所包含
的文字加以替换。在 Jscript 5.5 或更新版本中,replaceText 参数也可以是返回替换文本的函数。
说明 :replace 方法的结果是一个完成了指定替换的 stringObj 对象的复制。意思为匹配的项进行指定替换,其它不变作为
StringObj的原样返回。
ECMAScript v3 规定,replace() 方法的参数 replacement 可以是函数而不是字符串。在这种情况下,每个匹配都调用该函
数,它返回的字符串将作为替换文本使用。该函数的第一个参数是匹配模式的字符串。接下来的参数是与模式中的子表达式匹配的
字符串,可以有 0 个或多个这样的参数。接下来的参数是一个整数,声明了匹配在 stringObject 中出现的位置。最后一个参数是
stringObject 本身。结果为将每一匹配的子字符串替换为函数调用的相应返回值的字符串值。函数作参可以进行更为复杂的操作。
例子:
function replaceDemo() {结果:
var reg = /javascript/gi;
var text = "javaScript Javascript Javascript JavascripT"
return text.replace(reg,"JavaScript");
}
console.log(replaceDemo());
JavaScript JavaScript JavaScript JavaScript
使用正则表达式模式对字符串执行查找,并将包含查找的结果作为数组返回。
语法:stringObj.match(rgExp)
参数:
stringObj 必选项。对其进行查找的 String 对象或字符串文字。
rgExp 必选项。为包含正则表达式模式和可用标志的正则表达式对象。也可以是包含正则表达式模式和可用标志的变量名
或字符串文字。
例子:
var url = /(\w+):\/\/([\w.]+)\/(\S*)/;结果:
var text ="Visit my homepage http://blog.csdn.net/~wendy";
var result = text.match(url);
if(result!=null){
var fullurl = result[0];
var protocol = result[1];
var host = result[2];
var path = result[3];
}
console.log("fullurl:"+fullurl);
console.log("protocol:"+protocol);
console.log("host:"+host);
console.log("path:"+path);
fullurlhttp://blog.csdn.net/
protocol:http
host:blog.csdn.net
path:~wendy
4)split 方法
将一个字符串分割为子字符串,然后将结果作为字符串数组返回。
语法:stringObj.split([separator[, limit]])
参数 :
stringObj 必选项。要被分解的 String 对象或文字。该对象不会被 split 方法修改。
separator 可选项。字符串或 正则表达式 对象,它标识了分隔字符串时使用的是一个还是多个字符。如果忽略该选项,
返回包含整个字符串的单一元素数组。
limit 可选项。该值用来限制返回数组中的元素个数。
说明:split ()方法的结果是一个字符串数组,在 stingObj 中每个出现 separator 的位置都要进行分解。separator 不作为任何
数组元素的部分返回。
例子:
function SplitDemo(){结果:
var ss;
var s = "The rain in Spain falls mainly in the plain.";// 正则表达式,用不分大不写的s进行分隔。
ss = s.split(/s/i);
return(ss);
}
console.log(SplitDemo());
["The rain in ", "pain fall", " mainly in the plain."]