一路以来遇到正则表达式的地方都是直接去百度的,因为感觉大部分遇到的正则表达式的地方都是很常见的。这次顺便总结下正则表达式比较难记的部分,方便自己日后查阅吧( ̄. ̄)
正则表达式中的特殊字符
感觉MDN里面的资料还是挺不错的,特此记录下里面提到过的个人感觉比较难记的部分。
- ?:匹配前面一个表达式0次或者1次。等价于 {0,1}。此外,?还有一个比较重要的用途,即
如果?紧跟在任何量词 *、 +、? 或 {} 的后面,将会使量词变为非贪婪的(匹配尽量少的字符),和缺省使用的贪婪模式(匹配尽可能多的字符)正好相反。例如,对 "123abc" 应用 /d+/ 将会返回 "123",如果使用 /d+?/,那么就只会匹配到 "1"。
还可以运用于向前断言,如 x(?=y) 和 x(?!y) 。
- (x):捕获括号。匹配 'x' 并且记住匹配项。在匹配中可以使用1、2、n表示括号中的内容,而在替换中,则使用$1、$2、$n。
- (:x): 非捕获括号。匹配 'x' 但是不记住匹配项。
- x(?=y):匹配'x'仅仅当'x'后面跟着'y'.这种叫做正向肯定查找。例如,/Jack(?=Sprat)/会匹配到'Jack'仅仅当它后面跟着'Sprat'。/Jack(?=Sprat|Frost)/匹配‘Jack’仅仅当它后面跟着'Sprat'或者是‘Frost’。但是‘Sprat’和‘Frost’都不是匹配结果的一部分。
- x(!=y):匹配'x'仅仅当'x'后面不跟着'y',这个叫做正向否定查找。例如,/d+(?!.)/匹配一个数字仅仅当这个数字后面没有跟小数点的时候。正则表达式/d+(?!.)/.exec("3.141")匹配‘141’但是不是‘3.141’
使用正则表达式的js方法
js提供了不少使用正则表达式的方法。如RegExp的exec,和String的match、replace、search和split方法。
当你想要知道在一个字符串中的一个匹配是否被找到,你可以使用test或search方法;想得到更多的信息(但是比较慢)则可以使用exec或match方法。如果你使用exec或match方法并且匹配成功了,那么这些方法将返回一个数组并且更新相关的正则表达式对象的属性和预定义的正则表达式对象(详见下)。如果匹配失败,那么exec方法返回null(也就是false)。
match与exec区别
从前往往傻傻分不清match和exec的区别,因为两者的作用都是匹配字符串,返回数组,但是在不同情况下两者所返回的内容是不同的。
- 当正则表达式包含子表达式且不包含全局标志g时,二者返回相同的数组。
// 示例: var str = 'cat10,bat20,kat30'; var patten = /w(at)d+/; var arr = str.match(patten); arr[0] <=> ['cat10'] arr[1] <=> ['at'] var arr = patten.exec(str); arr[0] <=> ['cat10'] arr[1] <=> ['at']
- 当正则表达式带有全局标志g时,二者表现不一致。
match会返回所有符合条件的匹配项,并以数组形式返回。数组第一项存放第一个匹配项,数组第二项存放第二个匹配项...依次类推。
exec则永远返回第一个匹配项。但是当连续调用exec时,则每次的返回值都是下一个匹配项。
// 示例1: var str = 'cat,bat,kat'; var patten = /at/g; str.match(patten); //['at','at','at'] patten.exec(str); //['at'] // 示例2: var str = 'cat,kat'; var patten = /w+/g; str.match(patten); //['cat','bat','kat'] //第一次调用 patten.exec(str); //['cat'] //第二次调用 patten.exec(str); //['bat'] //第三次调用 patten.exec(str); //['kat']
- 当正则表达式包含子表达式时且包含全局标志g时,二者表现不一致。
match会返回所有符合条件的匹配项,并以数组形式返回。这时,match不会再返回子表达式的匹配项了。数组第一项存放第一个匹配项,数组第二项存放第二个匹配项...依次类推。
exec会返回子表达式的匹配项。换句话说就是,数组第一项存放整个匹配项,数组第二项存放第一个子表达式匹配项,数组第三项存放第二个子表达式匹配项...依次类推。
// 示例: var str = 'cat10,kat30'; var patten = /w(at)d+/g; var arr = str.match(patten); //['cat10','bat20','kat30'] var arr = patten.exec(str); arr[0] <=> ['cat10'] arr[1] <=> ['at']