一、表达式属性
1、g : global,全局匹配
2、i : ignore,忽略大小写
3、m : 执行多行匹配
二、常用表达式(用"..."表示表达式内容)
1、字符类
(1)[...]方括号内的任意字符
例子:
1)[abc],匹配a,或b或c;
2)[0-9],方括号内的任意一个数字;
3)[a-zA-Z],方括号内的任意一个字母;
4)[u4E00-u9FA5],方括号内的任意一个汉字;
(2)[^...]不在方括号内的任意字符
(3). 除换行符(
)或终止符(
)之外的任意字符
(4)w 任何ASCII字符组成的单词 等价于[0-9a-zA-Z_]
(5)W 任何不是ASCII字符组成的单词 等价于[^0-9a-zA-Z_]
(6)d 任何ASCII数字,等价于[0-9]
(7)D 任何不是ASCII数字,等价于[^0-9]
(8)s 任何Unicode空白符
(9)S 任何非Unicode空白符
/^S+$/,必须有内容,不能空,且至少一个以上
2、重复(量词)
(1){n,m} 匹配前一项至少n次,但不能超过m次
(2){n,} 匹配前一项至少n次或者更多
(3){n} 匹配前一项n次
(4)? 匹配前一项0次或者1次,等价于{0,1}
(5)+ 匹配前一项1次或者多次,等价于{1,}
(6
说明:以上(1)-(6)匹配规则是尽可能多地匹配,属于贪婪匹配;
在该匹配字符后紧加一个问号,可以改变规则为尽可能少地匹配。
1)贪婪匹配:
var regexp = /d{2,4}/g;
var str = "abc88888888";
str.match(regexp); //结果:["8888", "8888"]
2)非贪婪匹配:
var regexp = /d{2,4}?/g;
var str = "abc88888888";
str.match(regexp); //结果:["88", "88", "88", "88"]
3、分组(按左则括号顺序分组)
(1) (...) 分组,将若干项组合成一个单元
例子:
1)/^([a-zA-Z_]+)([0-9a-zA-Z_]+)$/,匹配数字、字母、下划线,但不能以数字开头;
2)IP
var regexp = /(d{1,3}).(d{1,3}).(d{1,3}).(d{1,3})/;
var str = "192.198.255.110";
str.match(regexp); //结果:["192.198.255.110", "192", "198", "255", "110"]
3)身份证
var input = "441622201006067878";
var regx = /^(d{6})(d{8})(d{4})$/;
4)email
var input = "gdyycn@google.com.cn";
var regx = /^([(w)|.]+)@([0-9a-zA-Z_-]+.[a-zA-Z.-]+)$/;
5)url
var input = "http://baidu.com/a/b/1213.png";
var regx = /^(http[s]?)://([0-9a-zA-Z_-]+.[a-zA-Z.-]+)/(.+)$/
(2) (?:exp) 仅进行分组,但不记录该分组的内容。
例子:
var regexp = /(?:ip:)(d{1,3}).(d{1,3}).(d{1,3}).(d{1,3})/;
var str = "ip:192.198.255.110";
str.match(regexp); //结果:["192.198.255:110", "192", "198", "255", "110"]
(3) ...(?=exp),零宽度正预测先行断言,断言"..."出现的位置的后面能匹配表达式exp,就是目标内容后面要出现什么样的内容,这个"什么样"由exp指定。
例子:
//提取价格前面的内容
var input = "aa:12price:1.28price:28aa11bb22价格:87";
var regx = /(price:|价格:)(?=[d.]+)/g;
console.log(input.match(regx)); //结果:["price:", "price:", "价格:"]
(4) (?<=exp)...,零宽度正回顾后发断言,断言"..."出现的位置的前面能匹配表达式exp,就是目标内容前面要出现什么样的内容,这个"什么样"由exp指定。
例子1:
//提取价格
var input = "aa:12price:1.28price:28aa11bb22价格:87";
var regx = /(?<=price:|价格:)([d.]+)/g;
console.log(input.match(regx)); //结果:["1.28", "28", "87"]
例子2:
//提取div标签内的内容
var input = "<div>div1</div><div>div2</div>";
var regx = /(?<=<div>)(w+)(?=</div>)/g;
console.log(input.match(regx)); //结果:["div1", "div2"]
(5) | 选择(或者)
例子:
var regexp = /^((d{3,4}-)|(d{3,4}))d{8}$/g;
var str = "021-87668778";//(021)87668778;021-87668778
str.match(regexp); //结果: 021-87668778
3、位置(锚字符)
(1)^ 匹配字符串的开头
(2)$ 匹配字符串的结尾
(3) 匹配单词的边界
var regexp = /Bj/g;
var str = "java javascript log4j";
str.match(regexp); //结果:["j", "j"],即java的j和javascript的j
(4)B 匹配非单词的边界
三、String对正则表达式的支持:
格式:字符串.search/match/replace/split(RegExp)
1、search()
(1)格式
字符串.search(正则表达式)
(2)结果
如果匹配,返回匹配的位置(第一个匹配的位置),否则反回-1;
(3)示例
var regExp1 = /script/; //或new RegExp(/script/)
var result = "javascript".search(regExp); //结果为4
result = "JavaScript".search(regExp); //结果为-1
result = "java".search(regExp); //结果为-1
regExp = "script"; //search方法参数可以不遵循正则表达式的格式,直接用字符串(JS引擎会自动根据该字符串创建RegExp对象)
result = "javascript".search(regExp); //结果为4
regExp = /script/i; //i,忽略大小写
result = "JavaScript".search(regExp); //结果为4
2、match()
(1)格式
字符串.match(正则表达式)
(2)结果
如果匹配,返回由匹配的子串组成的数组,否则返回null;
(3)示例
var regexp = new RegExp(/[0-9]/);
var result = '1 plus 2 equals 3'.match(regexp); //只匹配第一个,结果为:["1", index: 0, input: "1 plus 2 equals 3"],result[0]就是匹配的值"1"
regexp = new RegExp(/[0-9]/g); //g,全局匹配
result = '1 plus 2 equals 3'.match(regexp); //结果为:["1", "2", "3"]
result = '一加二等于三'.match(regexp); //结果为:null
3、replace()
(1)格式
字符串.replace(正则表达式,新值)
(2)结果
返回替换后的值;
(3)示例
var regexp = /j/g; //表示字符边界,这里意思是以j开头的字符
result = "java; javascript;log4j".replace(regexp,'J'); //将以j开头的单词的j替换为J,结果:Java; Javascript;log4j
regexp = /(([0-9]+))/g; //全局查找"(数字)"内容
result = "(1)java; (2)javascript".replace(regexp,'[$1]'); //将(数字)替换成[数字],$1指regexp中第一个分组括号中的内容
4、split()
var regexp = /#/;
var str = "abc#efg#xyz";
str.split(regexp); //结果:["abc", "efg", "xyz"]
四、RegExp对象
格式:
var regexp = new RegExp(正在表达式字符串,属性);//注意转义符
//var regexp = /正在表达式/;
regexp.exec/test(字符串)
(1)exec方法
如果匹配,返回第一次匹配的结果;否则,返回null
(2)test方法
如果匹配,返回true;否则,返回false
例1:
//var regexp = /d{2,4}?/g;
var regexp = new RegExp("\d{2,4}?","g");
var str = "abcd8888";
regexp.exec(str); //结果://结果:["88", index: 4, input: "abcd8888"]
regexp.test(str); //结果:true
例2(分组,返回所有匹配的分组,可以通过RegExp.$n获取第n组结果(n为分组序号)):
var regexp = /(d{1,3}).(d{1,3}).(d{1,3}).(d{1,3})/;
var str = "192.198.255.110";
console.log(regexp.exec(str)); //结果:["192.198.255.110", "192", "198", "255", "110", index: 0, input: "192.198.255.110"]
console.log(RegExp.$4); //返回第4组匹配结果