js 正则 数据类型检测四种方式

数据类型检测

1.typeof

	    1.返回字符串,字符串包含了对应数据类型
        2.不能检测null
        3.不能检测对象数据类型

2.instanceof 检测实例是否属于某个类的方法

		1.只要当前类的原型在当前实例的原型上,都是true
        2.只有改变了当前实例的原型链,检测结果就不再准确
        3.不能检测字面量方式创建的基本数据类型值
			 var ary  = [];
             console.log(ary instanceof Array);//true
             var obj  = {};
            console.log(obj instanceof Array);//false

             console.log(ary instanceof Object);//true
             function fn(){

             }
             console.log(fn instanceof Object);//true

             function fn(){
                 arguments.__proto__ = Array.prototype
                 console.log(arguments instanceof Array); //true
                
             }
             fn(1,2,3,4)
            

             var num = 1;
             console.log(num instanceof Number);//false
            
             var nom = new Number(1)
             console.log(nom instanceof Number);//true

3.constructor 原型中天生自带的属性名

		1.不能检测基本数据类型值得null.或undefined
        2.如果原型扩展以及继承都有可能导致原型指向发生改变,结果不准确
			 var ary = [];
             console.log(ary.constructor === Array);//true
             console.log(ary.constructor === Object);//false
             var obj = {};
             console.log(obj.constructor === Array);//false
             var num = 1;
             console.log(num.constructor === Number);//true

4.Object.prototype.toString.call()

        Object原型上的toString方法执行,会默认返回当前方法中this对应的结果
        toString  转字符串
            var num = 1;
            var arr = [1,2,3]
            var obj = {};
            console.log(obj.toString());//'[object Object]'
            console.log(num.toString());//'1'
            console.log( Object.prototype.toString.call(arr));//'[object Array]'
            console.log( Object.prototype.toString.call(null))//'[object Null]'
            console.log( Object.prototype.toString.call(undefined))//'[object Undefined]'
            num.toString === obj.toString//false
            console.dir(toString.call(window))//[object Window]
           

正则

 正则    引用数据类型 
  	  正则是js的内置类  RegExp
      正则就是处理字符串的,他是跟字符串相互配合使用
      字符串方法: charAt   substr  substring   slice   replace   split  indexOf  lastIndexOf  toUpperCase   toLowerCase   trim  trimLeft()  trimRight()
 1.字面量创建
	   var reg = /\d+/;
 2.实例创建   RegExp  
	  可以引入变量    
      如果出现转义字符  转义前面再加一个\
正则:正则由两部分组成:元字符和修饰符
	元字符  :在正则中有特殊含义的一些字符
 修饰符:就是把正则额外的修饰一下
             i: 不区分大小写
             m:多行匹配
             g:全局匹配
 
         元字符:量词元字符、普通元字符、特殊元字符
             量词元字符:代表出现的次数
                 *:代表0到多次
                 +:出现一到多次
                 ?:出现01{n}:出现n次
                 {n,}:至少出现n次
                 {n,m}出现n到m次
             特殊元字符:单个或者多字符组合在一起具有特殊意义
                 \:转义字符:可以把普通元字符字符转换为特殊的元字符,也可以把特殊元字符转换为普通元字符  //
                 .:除了换行符以外的任意字符
                 ^:以什么什么开头  //
                 $:以什么什么结尾  //
                 \n:换行符
                 \d:0-9之间的数字  //
                 \D:非0-9之间的数字
                 \w:数字、字母、下划线
                 \s:空白字符
                 \t:制表符
                 \b:单词边界
                 x|y:取x或y的任意一个  // 
                 [xyz]:取x、y、z中的任意一个  //
                 [a-z]:在a到z单位内取一个  //
                 [^a-z]:取反
                 ():分组  //
                 (?:):只匹配不捕获
                 (?=):正向预查
                 (?!):负向预查
 
             普通元字符:
             let reg = /name/
     
 
             正则捕获不到位null
             匹配不到位false
test:检测,匹配,如果检测成功,返回true,没有成功返回false
exec 捕获 返回一个数组 第一项就是捕获到的内容 第二项捕获内容开始的索引 第三项检测的整个字符串的整体
	1.返回一个数组   数组第一项是字符串中满足大正则中的内容
 	2.如果捕获不到  返回null
    var reg = /\d+/ 
    console.log(reg.exec('zhufeng2000peixun2019'));//["2000", index: 7, input: "zhufeng2000peixun2019", groups: undefined]
    1.正则的懒惰性 :正则找到符合正则的值以后,就不再向后捕获    reg:lastIndex  不加g每次默认从索引0开始捕获
    g:原理 :没捕获一次,当前正则的lastIndex就会修改成下一轮开始捕获的索引位置
    取消正则的懒惰性,用正则的修饰符g
        var reg = /\d+/g
        console.log(reg.lastIndex);//0
        console.log(reg.exec('zhufeng2000peixun2019'));//["2000", index: 7, input: "zhufeng2000peixun2019", groups: undefined]
        console.log(reg.lastIndex);//11   下一轮要开始的索引
        console.log(reg.exec('zhufeng2000peixun2019'));//["2019", index: 17, input: "zhufeng2000peixun2019", groups: undefined]
        console.log(reg.lastIndex);//21

    2.正则的贪婪性
    ?:放在量词的后面,是取消捕获的贪婪性
   一个一个字符进行捕获
    小括号
    小括号  也要进行一次捕获,从左往右依次进行捕获
     (?:) 取消捕获

正则简单案例

 手机号
    let reg = /^1\d{10}$/
    console.log(reg.test('12345678911'));//true

    有效数字
    let reg = /^-?(\d|[1-9]\d+)(\.\d+)?$/
    console.log(reg.test('a8864.aad'));//false

    身份证号
    let reg = /^(\d{6})([12]\d{3})(0[1-9]|1[0-2])(0[1-9]|12\d|3[0-1])(\d{3})(\d|x)/
    console.log(reg.exec('1406021996120375151203'));
    
    18-65
    let reg = /^(1[89]{1}|[2-5]\d{1}|6[0-5]{1})$/
    console.log(reg.test('66'));
    
    汉字  unicode [\u4E00-\u9FA5]  所有汉字编码范围
    let reg = /[\u4E00-\u9FA5]+/
    console.log(reg.test('的撒大苏打啊大苏打'));
    
    邮箱 
    let reg = /^[0-9a-zA-Z_\u4E00-\u9FA5]+@[0-9a-zA-Z]+(\.[0-9a-zA-Z]+)+$  /
    

正则的括号

	[]   中括号中,不识别多位数
 	var reg = /[abc]/
    console.log(reg.test('abc'));//true
     var reg1 = /^[1-9_]$/  //表示1到9或者_的任意一个
    console.log(reg1.test('9'));
    var reg2 = /[18-65]/  //1 8-6 5
 ()正则的小括号  
		1.改变正则的优先级
  		var reg = /^a|food$/;       //以a开头,以food结尾都返回true
        console.log(reg.test('a'));//true
        console.log(reg.test('aood'));//true
        console.log(reg.test('aoog'));//true
        console.log(reg.test('erfood'));//true
	 2.分组引用
  // \1 代指和第一个分组一模一样的内容
    var reg = /^(zhufeng)(peixun)\1\2$/
    console.log(reg.test('zhufeng'));//false
    console.log(reg.test('zhufengpeixunzhufeng'));//false
    console.log(reg.test('zhufengpeixunzhufengpeixun'));//true
	3.用于小正则捕获
    小括号要进行捕获,从左往右依次进行    
    var reg = /^-?(\d|[1-9]\d+)(\.(\d+))?$/
    console.log(reg.exec('35.6789'));

正则的match

 //match : 字符串方法  匹配   返回数组
        var str = 'zhufeng123peixun456';
        var arr = str.match(/\d+/g)
        console.log(arr);//正则match.html:14 (2) ["123", "456"]
        //加g代表全局捕获,捕获多次,把符合正则内容的字符串放到一个数组中

        //正则的修饰符
        //g:global :全局
        //i:ignoreCase :忽略大小写
        //m: mutiline  : 多行匹配

        var reg = /A/i;  //在字符串中出现a或A ,都返回true
        console.log(reg.test('abc'));//true

正则的replace

replace : 字符串替换    原字符串不发生改变   会得到替换之后的返回值
    每次只能替换一个
  	var str = 'trueortrue'
    var newStr = str.replace('true','false').replace('true','false')
    console.log(newStr);//falseorfalse 

    结合正则
        (1)replacee(reg,str);用该正则对字符串形成捕获,把捕获到内容替换成后面的字符串
		var str = 'trueortrue'
        var newStr = str.replace(/true/g,false)
        console.log(newStr);//falseorfalse 
    正则和回调函数
        1.正则对字符串进行捕获,并且将回调函数的返回值覆盖捕获到的内容
        2.正则捕获几次,回调函数执行几次
        3.形参分别代表不同的值         
		  var str = 'trueortrue'
        var newStr = str.replace(/true/g,function(a,b,c){
            console.log(a);//true   true     //第一个参是捕获到的内容
            console.log(b);//0  6            //第二个参捕获的内容开始的索引位置
            console.log(c);//trueortrue     //原来字符串
        
            //console.log(100);
            return false
            
        })
        console.log(newStr);//falseorfalse  
replace案例
//把所有首字母大写
      var str = 'my name is niu,i am 28 years old';
        var ary = str.replace(/\b[a-z]/g,function(a,b){   //左边界
            a = a.toUpperCase() 
            console.log(a,b)   
            return a
        })
        console.log(ary);
         


 //把数字首字母大写
        var str = '20191224'
        var ary = ["零","壹","贰","叁","肆","伍","陆","柒","捌","玖","万","仟"];
        var aoe = str.replace(/\d/g,function(a,b){
            for(var i = 0;i<ary.length;i++){
                console.log(a);
                if(i = a ){
                    return ary[i]
                }
            }
            return a    
            //  return ary[arguments[0]]   //让捕获到的数字作为数组ary的索引,再返回
        })
        console.log(aoe);//贰零壹玖壹贰贰肆 */
        
     //把下面时间格式化成2019年12月24日16时02分30秒
        var  str = "2019-12-24 16:02:30";
        var  ary = ["年","月","日","时","分","秒"];
        var i = 0
        var aoe = '';
        var one = str.replace(/\d+/g,function(a,b){
            
           aoe += a + ary[i++]
           console.log(aoe);
            return aoe
        })
        console.log(aoe);
        



        // 加千分符,给下面的数字加','使其成为13,234,567,753,224
         var str = "13234567753224";
        var newStr = str.replace(/^(\d{1,3})((\d{3})+)$/,function(a,b,c){
            // console.dir(a);
            // console.log(b);
            // console.log(c);
            var part2 = c.replace(/\d{3}/g,function (d,e) {
                console.log(d);
                
                return ','+d
            })
            return b +part2
        })
        console.log(newStr);


        var str = "13234567753224";
        var newStr = str.replace(/\d/g,function(a,b){
            //arguments[0]  捕获到数字内容   arguments[1] 捕获内容对应的索引
            console.log(str.length);
            
            if((str.length-b-1)%3 === 0 && str.length-1 !== b){
                return a + ','
            }else{
                return a
            }
        })
        console.log(newStr);
        ```

发布了17 篇原创文章 · 获赞 23 · 访问量 370

猜你喜欢

转载自blog.csdn.net/wang_js_amateyr/article/details/103848557