RegExp正则表达 格式化字符串

RegExp+递归实现字符串格式化

需求

日常开发中难免会遇到这样类型的字符串‘{xxx:xxx,xxx:[aa,bbb]}’,看似对象,却无法使用parse来格式化,想这种类型字符串就需要用到正则表达来实现,同时也可以运用于导表

基本逻辑

判断字符串是属于什么类型,格式化字符串

如果是数组类型,取‘[]’里面内容,判断该内容的类型,格式化

如果是键值对,取 ‘{’ 至 ‘:’之间的内容为key, 取 ‘:’ 至 ‘}’之间为value,判断value类型,格式化 value 值

如果是整型,直接 parseInt,

如果不是以上类型,直接返回字符串

过程主要采用递归方法

就像剥洋葱一样层层剖析

逻辑如下

// 格式化类
class ParseUtil {
    public isStr(str:string) {
        return typeof str == "string"
    }
    // 是否是数组类型
    public isArrStr(str:string) {
        if (!str || typeof str != 'string') {
            return false
        }
        return (/^\[.*\]$/g).test(str)
    }
    // 是否是键值对类型
    public isObj(str:string) {
        if (!str || typeof str != 'string') {
            return false
        }
        return (/^\{.*\}$/g).test(str)
    }
    // 是否是整型
    public isInt(str:string) {
        if (!str ) {
            return false
        }
        if(typeof str != 'number'){
            return true
        }
        if(typeof str != 'string') {
            return false
        }
        return !(/\D/g).test(str)
    }
    
    public parseInt(str: string){
        return parseInt( str )
    }

    public parseArr(str: string) {
        let arrStr = str.match(/{[^}{]*?}/g)
        // console.log( arrStr )
        let arr = [];
        if (arrStr) {
            for (let i = 0; i < arrStr.length; i++) {
                let item = arrStr[i]// {a:a}
                let value = this.parse( item )
                if( value ){
                    arr.push( value ) 
                }
            }
        }
        return arr;
    }

    public parseObj(str: string){
        if( !this.isStr(str) ){
            return null;
        }
        if( !this.isObj(str) ){
            return null
        }
        let key = str.match(/(?<={)[^:]*/g);
        let value = str.match(/(?<=:)[^?}]*/g);
        let obj = {};
        if (!key && !value) {
            console.log("这是一个空对象",str)
            return obj
        }
        else if( !key ){
            console.log("不存在key",str);
            return null;
        }
        else if( key && !value){
            console.log("不存在值的键值对",str)
            return null;
        }
        else{
            let K = key[0];
            let V = value[0];
            obj[K] = this.parse(V);
            return obj;
        }
    }

    public parse(str: string) {
        let ret = null;
        if( this.isArrStr(str) ){
            ret = this.parseArr(str)
        }
        else if( this.isObj(str) ){
            ret = this.parseObj( str )
        }
        else if( this.isInt(str)){
            ret = this.parseInt(str)
        }
        else {
            // 它就是一个字符串
            ret = str
            console.log( "它就是一个字符串",ret)
        }
        return ret ;
    }
}

let test = '[{a:1},{b:2},{ccc:ccc:ccc},{arr:[]},[aaa,aaa]]';

console.log( new ParseUtil().parse ( test) ) 

输出如下

RegExp正则表达 格式化字符串

目前不支持多维数据结构,例如数组套数组‘[[{a:1},{b:2},{ccc:ccc:ccc},{arr:[]}]]’,这样类型依然如上输出

源文件

vscode + runner 可直接运行

原创文章,作者:ourygey,如若转载,请注明出处:https://ourygey.com/2021/10/09/regexp%e6%ad%a3%e5%88%99%e5%8c%b9%e9%85%8d-%e5%ad%97%e7%ac%a6%e4%b8%b2%e8%bd%ac%e5%af%b9%e6%95%b0%e7%bb%84/

发表评论

您的电子邮箱地址不会被公开。