<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>正则表达式小结</title>
</head>
<body>
<script>
//两种方法实例化regexp对象
// 1、字面量
// 2、构造函数
// 1、字面量
var regb = /\bis\b/
var regbg = /\bis\b/g; //\b表示单词边界、g全局匹配、i忽略大小写
var regbgi = /\bis\b/gi; //i忽略大小写
var string1 = "He is a boy.This is a dog.Where is she?"
var string2 = "He is a boy.Is he?"
console.log(string1.replace(regb,"X"));
console.log(string1.replace(regbg,"X"));
console.log(string2.replace(regbgi,"X"));
// 2、构造函数
var regg = new RegExp("\\bis\\b");
var reggg = new RegExp("\\bis\\b","g");
var string3 = "He is a boy.This is a dog.Where is she?"
console.log(string3.replace(regg,"X"));
console.log(string3.replace(reggg,"X"));
//3、元字符
// --原义文本字符 \b
// --元字符 *+?$^./\(){}[]
//4、字符类 ---通过元字符[]构建一个简单的类匹配某一类字符(并不是匹配某一个)
console.log("a1b2c3d4".replace(/[abc]/g,"X"));
//取反--使用元字符^创建反向类
console.log("a1b2c3d4".replace(/[^abc]/g,"X"));
//5、范围类
//可以使用[a-z]来匹配从a到z的任意字符
console.log("a1b2c3x4z9".replace(/[a-z]/g,"Q"));
console.log("a1b2c3x4z9AFSDF".replace(/[a-zA-Z]/g,"Q"));
console.log("2017-03-21".replace(/[0-9]/g,"Q"));
console.log("2017-03-21".replace(/[0-9-]/g,"Q"));
//预定义类 匹配常见的字符类
// . [^\r\n] 除了回车符和换行符之外的所有字符
// \d [0-9] 数字字符
// \D 非数字字符 大写的都表示取反
// ab\d.
//边界 \b \B
// ^ 在[]以内的时候,表示取反;不在[]以内表示 以xxx开始;$表示以xxx结束
console.log("@123@abc@".replace(/@./g,"Q"));
console.log("@123@abc@".replace(/^@./g,"Q"));
console.log("@123@abc@".replace(/.@/g,"Q"));
console.log("@123@abc@".replace(/.@$/g,"Q"));
//m多行匹配
var mulSrt = "@123\t@456\t@789"; // \b在这里给字符串换行了
console.log(mulSrt.replace(/^@\d/g,"X"));
console.log(mulSrt.replace(/^@\d/gm,"X")); //m
//量词
// ? 0/1次
// + 1/n次
// * 0/n次
// {n} n次
// {n,m} n~m次
// {n,} n~至少
//贪婪模式&非贪婪模式
console.log("12345678".replace(/\d{3,6}/g,"Q"));//默认的贪婪模式
console.log("12345678".replace(/\d{3,6}?/g,"Q")); //贪婪模式。在量词后加上?;让正则表达式尽可能少的匹配。一旦成功匹配就不再尝试
//分组----()
console.log("a1b2c3d4".replace(/[a-z]\d{3}/g,"X"));
console.log("a1b2c3d4".replace(/([a-z]\d){3}/g,"X"));
//或
//反向引用
console.log("2017-03-21".replace(/\d{4}-\d{2}-\d{2}/g,"$1"));
console.log("2017-03-21".replace(/(\d{4})-(\d{2})-(\d{2})/g,"$2/$3/$1")); //分组捕获,相当于提取变量
console.log("Hello-World".replace(/(\w{5})-(\w{5})/g,"$2-$1"));
//忽略分组
console.log("2017-03-21".replace(/(?:\d{4})-(\d{2})-(\d{2})/g,"$2/$3/$1")); //忽略分组。在分组内加上?:即可。年份忽略分组之后,月份变为$1,日为$2,所以应该写为
console.log("2017-03-21".replace(/(?:\d{4})-(\d{2})-(\d{2})/g,"$1/$2/$3"));
//前瞻--正则表达式从文本头部向尾部开始解析,文本尾部方向,称为“前”
//在正则表达式匹配到规则的时候,向前检查是否符合断言,后顾则方向相反 js不支持后顾
console.log("a2*3".replace(/\w(?=\d)/g,"X"));
console.log("a2*34v8".replace(/\w(?=\d)/g,"X"));
//js对象属性
//test RegExp.prototype.test(string); 用来测试
var reg1 = /\w/;
var reg2 = /\w/g;
while(reg2.test("ab")){
console.log(reg2.lastIndex); //1 2 lastIndex:当前【匹配结果】的【最后一个字符】的【下一个】字符;
}
//exec() RegExp.prototype.exec(string)
//String.protatype.search(reg)
//String.protatype.match(reg) 除了常规的数组元素之外,返回的数组还有两个对象元素。
//index声明匹配文本的起始字符;
//input 声明对stringObject的引用;
var reg3 = /\d(\w)\d/;
var reg4 = /\d(\w)\d/g;
var ts = "#1a2b3c4d5e";
var ret = ts.match(reg3);
console.log(ret);
console.log(ret.index + "\t" +reg3.lastIndex);
var ret1 = ts.match(reg4);
console.log(ret1);
console.log(ret1.index + "\t" +reg4.lastIndex);
//String.protatype.split(reg)
//String.protatype.replace(str,replaceString)
//String.protatype.replace(reg,replaceString)
//String.protatype.replace(reg,function)
//function 会在每次匹配替换的时候调用,包含四个参数:1、匹配字符串;2、正则表达式分组内容,没有分组就没有参数;3、匹配项在字符串中的index;4、原字符串
"a1b2c3d4e5".replace(/\d/g,function(match,index,origin){
// console.log(match);
console.log(index);
return parseInt(match)+1;
})
"a1b2c3d4e5".replace(/(\d)(\w)(\d)/g,function(match,group1,group2,group3,index,origin){
console.log(match);
return group1 + group3;
})
</script>
</body>
</html>
正则浅学
最新推荐文章于 2024-09-05 13:52:17 发布