下面是使用了正则表达式,从字符串 ‘10011001000111’ 中 晒选出 ‘10’ 、‘0011’、‘01’、‘1100’等诸如此量对称的字符串块出来。
在其中使用的是ES6标准来编写的,具体可以查看代码的注释。有疑问的可以留言一起讨论!
1 export default (str)=>{
2 let r =[]; ///先准备好一个数组容器,把结果放进去
3 let match = (str) =>{ ///定义一个函数,用来处理截取过来的字串
4 let j = str.match(/^(0+|1+)/)[0]; ///这里使用了Array.prototype.match()其返回数组
//////使用了 ^()的意思是匹配字符串中第一个含有括号里面的字符
//////而 0+ 是指匹配到0 或者 00 或者 00000000 等诸如此类的字符。
5 let o = (j[0]^1).toString().repeat(j.length);
////匹配后拿到j 数组里面的第一个元素 然后对其进行 ^1 的运算(既0=>1 或 1=>0 的操作)
////然后使用repeat()方法对其进行补字符长度补全的操作,例如目前是两位:00 占用两个位,如
////果需要4个位,则用 repeat(4)将 00 补全位 0000,
////这个算法的核心是,利用自己建立的模板 比如 通过以下一行代码,建立了如‘0011’ ‘10’等
////的模板,然后跟截取过来的字符串做 正则匹配对比,如果有则返回此 字符段 没有则返回空。
////其核心就是以上的步骤,希望了解里面的匹配原则,再去编写算法,这样才能对这算法印象深刻
6 let reg = new RegExp(`^(${j}${o})`);
7 if(reg.test(str)){
8 return RegExp.$1
9 };
10 else{
11 return '';
12 }
13 }
14 for(let i= 0; i<str.length-1; i++){
15 let sub = match(str.slice(i))
16 if(sub) {
17 r.push(sub);
18 }
19 }
20 return r;
21 }