正则表达式
一、两种创建方式
1.直接量 var reg=/abc/; 2.new RegExp(); //var reg=new RegExp('abc','i');
二、修饰符
i:ignoreCase 忽略大小写
g:全局匹配
m:多行匹配
var reg=/^a/m; var str='abcde\na';//\n 换行 console.log(str.match(reg)); // ["a", "a"]
//转义字符 \ :\r\n 回车换行 \t 制表符 var html='\ <div>\ <span>123</span>\ </div>'; document.body.innerHTML=html;
三、方括号(代表一位)
[abc] : 查找方括号之间的字符。
[^abc] : 查找不在方括号之间的字符
[0-9],[a-z],[A-Z],[A-z] :查找0到9的数字 等
(red|blue|green) :查找指定的选项。
var reg=/(abc|bcd)[0-9]/g; var str='abc3bcd2'; console.log(str.match(reg)); // ["abc3", "bcd2"]
四、元字符:拥有特殊含义的字符
. : [^\r\n] 查找单个字符,除了换行和行结束符。
\w : [0-9A-z_] ,\W:[^\w]
\d : [0-9],\D:[^\d]
\s : [\t\n\r\v\f ] 空白字符, \S:[^\s]
\b : 单词边界 \B:[^\b]
//单词边界 var reg=/\bfce\b/g; var str='asd fce sdf'; console.log(str.match(reg));//["fce"]
五、量词:代表数量
n+ : {1,} 1到多个
n* : {0,}
n? : {0,1}
n{X} : X个
n{X,Y} : X-Y个
n{X,} : X到多个
?=n : 匹配其后紧接n 的字符串
?!n : 匹配其后没有紧接n 的字符串
// 正向预查 正向断言 var reg=/\d+(?=ab)/g; //匹配其后有ab的字符串 var reg1=/\d+(?!ab)/g; //匹配其后没有ab的字符串 var str='31abc12'; console.log(str.match(reg));//[31],不包括括号的内容 console.log(str.match(reg1));//[3,12]
六、RegExp对象属性
global :RegExp对象是否具有标志 g。
ignoreCase :是否具有标志 i
multiline :是否具有标志 m。
source :正则表达式的源文本。
lastIndex :一个整数,标示开始下一次匹配的字符位置。
七、RegExp对象方法
compile:编译正则表达式
exec:检索字符串中指定的值。返回找到的值,并确定位置
test:检索字符串中指定的值。返回true或false
// eg:exec ,lastIndex var reg=/ab/g; var str='ababab'; console.log(reg.lastIndex);//游标的位置 0 console.log(reg.exec(str));// ["ab", index: 0, input: "abababab"] console.log(reg.lastIndex);//游标的位置 2 console.log(reg.exec(str));// ["ab", index: 2, input: "abababab"] console.log(reg.lastIndex);//游标的位置 4 console.log(reg.exec(str));// ["ab", index: 4, input: "abababab"]
八、支持正则表达式的string对象的方法
search :返回匹配的位置,匹配不到返回-1
match :返回匹配的数组
replace:替换与正则表达式匹配的子串
split: 把字符串分割为字符串数组
var str='asdaabb'; var reg=/(\w)\1(\w)\2/g; console.log(str.match(reg));//["aabb"] console.log(str.search(reg));//3 console.log(str.replace(reg,'11111'));//asd11111 console.log(str.split(reg));//["asd", "a", "b", ""] 返回的数组中包括与这些子表达式匹配的字串
九、子表达式,非贪婪匹配
// ()子表达式 \1代表和前面子表达式的内容相同 var str='aabb'; var reg=/(\w)\1(\w)\2/g; console.log(str.match(reg));//["aabb"] console.log(reg.exec(str)); //["aabb", "a", "b", index: 0, input: "aabb"] 数组a,b分别是两个子表达式的内容
// 默认贪婪匹配,非贪婪匹配:增加? var str='aaaa'; var reg=/a{1,3}/g;//贪婪匹配 ,先匹配a的数量是3 var reg1=/a{1,3}?/g;//非贪婪匹配 ,先匹配a的数量是1 var reg2=/a??/g;//第一个?:(0,1),第二个?:非贪婪匹配 ,先匹配a的数量是0 console.log(str.match(reg));//[aaa,a] console.log(str.match(reg1));//[a,a,a,a] console.log(str.match(reg2));//["", "", "", "", ""]
十、例子
//检验字符串首尾是否含有数字,->首或者尾 var reg=/^\d|\d$/g; //首或者尾 是数字 var reg1=/^\d[\w\W]*\d$/g; //首尾都是数字 var str='123qwe31a1'; console.log(reg.test(str));
//把aabb 换成 bbaa var reg=/(\w)\1(\w)\2/g; var str='aabb'; console.log(str.replace(reg,'$2$2$1$1'));//$1代表第一个子表达式 // 参数1:匹配全局(aabb) 参数2:匹配一个子表达式(a)参数3:匹配一个子表达式(b) console.log(str.replace(reg,function($,$1,$2){ return $2+$2+$1+$1 }));
// the-first-name 换成 theFirstName var str='the-first-name'; var reg=/-(\w)/g; console.log(str.replace(reg,function($,$1){ return $1.toLocaleUpperCase(); }))
// 将aaabbbbccccc 换成 abc var str='aaaaaaaaaaabbbbbbbbbcccccccccccc'; var reg=/(\w)\1*/g; console.log(str.match(reg)); //["aaaaaaaaaaa", "bbbbbbbbb", "cccccccccccc"] console.log(str.replace(reg,'$1'));//abc
// 将str 换成 10,000,000 var str='100000000000'; var reg=/(?=(\B)(\d{3})+$)/g; console.log(str.match(reg)); console.log(str.replace(reg,','));