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) )
输出如下
目前不支持多维数据结构,例如数组套数组‘[[{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/