正则浅学

<!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>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值