模式修饰符
i 忽略大小写
g 全局匹配
m 多行匹配
正则表达式方法
test
alert(/Box/i.test('box')); //true 写法一
var pattem = new RegExp('Box','i');
var str = 'box';
alert(pattern.test(str)); //true 写法二
exec
有就显示数组(只匹配第一个),没有就返回null
var pattem = /Box/i; //忽略大小写
var str = 'box';
alert(pattern.exec(str)); //box
test&exec
开启全局匹配时,索引位置不会重置
var pattern = /box/ig;
var str = 'This is a Box!That is a box!';
alert(pattern.test(str)); //true
alert(pattern.lastIndex); //13
alert(pattern.exec(str)); //box
alert(pattern.lastIndex); //27
String对象的正则表达式方法
match
返回子串或null
var pattern = /Box/i; //忽略大小写
var str = 'This is a Box!That is a box!';
alert(str.match(pattern)); //Box 匹配到第一个字符串,返回数组
var pattern = /Box/ig; //全局匹配忽略大小写
var str = 'This is a Box!That is a box!';
alert(str.match(pattern)); //Box,box 匹配所有字符串,返回数组
search
返回第一个匹配的位置,从0开始计数,匹配不到返回-1
var pattern = /box/;
var str = 'This is a Box!That is a box!';
alert(str.search(pattern)); //24
var pattern = /box/i; //忽略大小写
var str = 'This is a Box!That is a box!';
alert(str.search(pattern)); //10
var pattern = /xox/;
var str = 'This is a Box!That is a box!';
alert(str.search(pattern)); //-1 匹配不到
replace
返回替换后的字符串
var pattern = /Box/;
var str = 'This is a Box!That is a box!';
alert(str.replace(pattern,'Tom')); //This is a Tom!That is a box!
var pattern = /Box/ig; //全局匹配忽略大小写
var str = 'This is a Box!That is a box!';
alert(str.replace(pattern,'Tom')); //This is a Tom!That is a Tom!
split
返回分割后的数组,默认全局匹配,匹配不到则返回原字符串
var pattern = /!/; //匹配感叹号
var str = 'This is a Box!That is a box!';
alert(str.split(pattern)); //This is a Box,That is a box,
alert(str.split(pattern).length); //3
var pattern = / /; //匹配空格
var str = 'This is a Box!That is a box!';
alert(str.split(pattern)); //This,is,a,Box!That,is,a,box!
alert(str.split(pattern).length); //7
RegExp对象的静态属性
早期浏览器有差别,不常用
疑问:lastMatch等,全局时,是最后一次匹配的第一个匹配项,还是最后一个匹配项?
input($_)
存储当前被匹配的字符串
var pattern = /Box/;
var str = 'This is a Box!That is a box!';
alert(RegExp.input); //初始为空字符串
pattern.test(str); //使用一下正则
alert(RegExp.input); //This is a Box!That is a box!
//alert(RegExp['$_']) //其他写法,其他静态属性都有自己的短名
//alert(RegExp.$_) //其他写法,只有input可以这么写
leftContext($`)
最后一次匹配时,第一个匹配到的字符串的前子串
var pattern = /box/ig; //全局匹配忽略大小写
var str = 'This is a Box!That is a box!';
pattern.test(str);
alert(RegExp.leftContext); //This is a
var pattern = /box/g; //全局匹配
var str = 'This is a Box!That is a box!';
pattern.test(str);
alert(RegExp.leftContext); //This is a Box!That is a
rightContext($’)
最后一次匹配时,第一个匹配到的字符串的后子串
var pattern = /box/ig;
var str = 'This is a Box!That is a box a box!';
pattern.test(str);
alert(RegExp.rightContext); //!That is a box a box!
lastMatch($&)
最后一次匹配时,第一个匹配到的字符串
var pattern = /box/ig;
var str = 'This is a Box!That is a box a box!';
pattern.test(str);
alert(RegExp.lastMatch); //Box
lastParen($+)
最后一对圆括号内的匹配子串
multiline($*)
用于指定是否所有的表达式都用于多行的布尔值
RegExp对象的实例属性
早期浏览器有差别,不常用
global
Boolean值,表示g是否已设置
var pattern = /box/g;
alert(pattern.global); //true
var pattern = /box/;
alert(pattern.global); //false
ignoreCase
Boolean值,表示i是否已设置
var pattern = /box/i;
alert(pattern.ignoreCase); //true
var pattern = /box/;
alert(pattern.ignoreCase); //false
multiline
Boolean值,表示m是否已设置
var pattern = /box/m;
alert(pattern.multiline); //true
var pattern = /box/;
alert(pattern.multiline); //false
source
正则表达式的源字符串形式
var pattern = /box/g;
alert(pattern.source); //box
lastIndex
整数,代表下次匹配将从哪里字符串位置开始
元字符
反斜杠后的元字符将失去其特殊含义,匹配特殊字符必须加反斜杠
元字符
. 匹配除换行符意外的任意字符
[A-Z] 匹配一个大写字母
[a-z] 匹配一个小写字母
[0-9] 匹配一个数字
[a-zA-Z0-9] 匹配一个大小写字母或数字
[^0-9] 匹配一个非数字
[^a-z0-9] 匹配任意一个不在括号中的字符集中的字符
\d 匹配数字
\D 匹配非数字,同[^0-9]
\w 匹配字母和数字及_
\W 匹配非(字母和数字及_)
空白字符
\0 匹配null字符
\b 匹配单词边界,不匹配字符
\f 匹配进制字符
\n 匹配换行符
\r 匹配回车字符
\t 匹配制表符
\s 匹配空白字符、空格、制表符、换行符
\S 匹配非空白字符
重复字符
? 匹配0个或1个
* 匹配0个或任意多个
+ 匹配至少一个
{m} 匹配m个
{m,} 匹配m个,或m个以上
{m,n} 匹配最少m个,最多n个
锚字符
^ 行首匹配
$ 行尾匹配
\A 只有匹配字符串开始处
\b 匹配单词边界,词在[]内无效
\B 匹配非单词边界
\G 匹配当前搜索的开始位置
\Z 匹配字符串结束处或行尾
\z 只匹配字符串结束处
或’|’
aa|bb|cc 匹配aa或bb或cc中任意一个
分组,小括号()
(string) 括号内为一个整体
例:
var pattern = /8(.*)8(.*)6/;
pattern.test('This is a 8google81236');
alert(RegExp.$1); //google 获取模式中第一个分组对应的匹配字符串
alert(RegExp.$2); //123 获取模式中第二个分组对应的匹配字符串,$几表示第几个分组
例:在不清楚获取的字符串是啥时对其进行加粗
var pattern = /8(.*)8/;
var str = 'This is a 8google8'; //var str = 'This is a 8soso8';
document.write(str.replace(pattern, '<strong>$1</strong>'));
例:交换位置
var pattern = /(.*)\s(.*)/;
var str = 'google baidu';
alert(str.replace(pattern, '$2 $1'));//baidu google
贪婪和惰性
在重复字符后加?,会变成惰性匹配
var pattern = /[a-z]+/; //贪婪
var str = 'abcdefg';
alert(str.replace(pattern, '1')); //1
var pattern = /[a-z]+?/; //惰性
var str = 'abcdefg';
alert(str.replace(pattern, '1')); //1bcdefg
var pattern = /8(.*)8/; //贪婪
var str = '8google8 8google8 8google8';
document.write(str.replace(pattern, '<strong>$1</strong>'));
//<strong>google8 8google8 8google</strong>
var pattern = /8(.*?)8/; //惰性
var str = '8google8 8google8 8google8';
document.write(str.replace(pattern, '<strong>$1</strong>'));
//<strong>google</strong> 8google8 8google8
var pattern = /8(.*?)8/g; //惰性,开启全局。
//var pattern = /8([^8]*)8/g //另一种惰性写法
var str = '8google8 8google8 8google8';
document.write(str.replace(pattern, '<strong>$1</strong>'));
//<strong>google</strong> <strong>google</strong> <strong>google</strong>
捕获性分组和非捕获组?:
var pattern = /([a-z]+)\s([0-9]{4}$)/; //捕获性分组,括号匹配的字符串会捕获到数组
var str = 'google 2012';
var a = pattern.exec(str); //返回长度3的数组
alert(a[0]); //google 2012 匹配到的字符串
alert(a[1]); //google 第一个分组括号的字符串
alert(a[2]); //2012 第二个分组括号的字符串
var pattern = /(?:[a-z]+)\s([0-9]{4}$)/; //不想捕获到数组,就在括号内最开始加?:
var str = 'google 2012';
alert(pattern.exec(str)); //google 2012,2012
非捕获组?=、?<=
肯定式向前查找?=、肯定式向后查找?<=(这个试不成功)
var pattern = /goo(?=gle)/; //goo后面必须跟gle
//等价于var pattern = /(?=google)goo/;
var str = 'google';
alert(pattern.exec(str)); //goo
var pattern = /goo(?=gle)/; //goo后面必须跟gle
var str = 'googee'; //goo后面没有gle
alert(pattern.exec(str)); //null
非捕获组?!、?
var pattern = /goo(?!gee)/; //goo后面不能跟gee
var str = 'google'; //goo后面是gle
alert(pattern.exec(str)); //goo
var pattern = /goo(?!gee)/; //goo后面不能跟gee
var str = 'googee'; //goo后面是gee
alert(pattern.exec(str)); //null
数组嵌套分组
var pattern = /(a?(b?(c?)))/;
var str = 'abc';
alert(pattern.exec(str)); //abc,abc,bc,c
换行模式
var pattern = /\d+/;
var str = '1.baidu\n2.google\n3.bing';
alert(str.replace(pattern,'#')); //#.baidu\n2.google\n3.bing
var pattern = /\d+/g; //开启全局
var str = '1.baidu\n2.google\n3.bing';
alert(str.replace(pattern,'#')); //#.baidu\n#.google\n#.bing
var pattern = /^\d+/g; //开启全局,限定开始位置
var str = '1.baidu\n2.google\n3.bing';
alert(str.replace(pattern,'#')); //#.baidu\n2.google\n3.bing
var pattern = /^\d+/gm; //开启全局,多行模式,限定开始位置
var str = '1.baidu\n2.google\n3.bing';
alert(str.replace(pattern,'#')); //#.baidu\n#.google\n#.bing