出来混总是要还的-JS正则前传

栏目: JavaScript · 发布时间: 6年前

内容简介:前言: 正则表达式一直是个人痛点, 相信很多人 (看到题的第一反应就是, 握草这还不简单, 两层循环加上珍藏多年的字符串拼接技术(-_-||), 妥妥的解决这个问题写完并且测试结果正确, 就开始沾沾自喜, 感觉万事大吉。( 这种状态很像在工作中, 写完功能不去优化一样 )

前言: 正则表达式一直是个人痛点, 相信很多人 ( 说的就是你 ) 跟我一样存在类似的情况, 正则是反复学, 反复忘, 从个人角度看主要的原因还是:较少的使用场景, 如果像数组的几个常用方法一样, 绝大多数人肯定能熟练运用。 最近迫使我拿起正则这把屠龙刀的起因是( 时间充足和一道小的面试题 ), 那咱们就先从这道面试题说起

Demo1

// 观察如下规律, 写一个函数`accum`
// accum("abcd");      // "A-Bb-Ccc-Dddd"
// accum("helloWorld");   // "H-Ee-Lll-Llll-Ooooo-Wwwwww-Ooooooo-Rrrrrrrr-Lllllllll-Dddddddddd"
// accum("China");      // "C-Hh-Iii-Nnnn-Aaaaa"
复制代码

看到题的第一反应就是, 握草这还不简单, 两层循环加上珍藏多年的字符串拼接技术(-_-||), 妥妥的解决这个问题

const accum = str => {
  let result = "";
  str.toLowerCase().split("").forEach((el, idx) => {
      for (let i = 0; i <= idx; i++) {
        if (i == 0) {
          result += el.toUpperCase();
        } else {
          result += el;
        }
      }
      result += el + "-";
    });
  return result.slice(0, -1);
  // 看到slice慌不慌?是不是忘记这鬼东西是干什么的了?和substr/string有什么区别?
};
console.log(accum("CHina"));
复制代码

写完并且测试结果正确, 就开始沾沾自喜, 感觉万事大吉。( 这种状态很像在工作中, 写完功能不去优化一样 )

上面的一坨代码, 对, 就是一坨代码, 一坨像极了业务功能的逻辑代码, 没有精巧的思路, 没有精致的写法。 这踏马跟咸鱼有什么区别?

优雅的循环

const accum = str => {
  let result = "";
  for (let i = 0; i < str.length; i++) {
    const temp = str[i];
    result += temp.toUpperCase();
    for (let j = i; j > 0; j--) {
      result += temp.toLowerCase();
    }
    result += "-";
  }
  return result.slice(0, -1);
};
console.log(accum("CHina"));
复制代码

优雅的循环, 优雅的循环, 优雅的循环 啊、啊、啊!

精致的利己主义者

const accum = str => {
  return Array.from(str.toLowerCase(), (item, index) => {
    return (
      item.toUpperCase() + Array.from({length: index}, () => {
          return item;
        }
      ).join("")
    );
  }).join("-");
};
console.log(accum("CHina"));
复制代码

放荡不羁的 reduce

const accum = str => {
  return Array.from(str.toLowerCase()).reduce((accu, cur, idx) => {
      accu.push(cur.toUpperCase().padEnd(idx + 1, cur));
      return accu;
    }, []).join("-");
};
console.log(accum("CHina"));
复制代码

百辟匕首( RegExp )

匹配与获取字符串方法

const accum = str => {
  return str.toLowerCase().replace(/\w{1}/gi, (item, idx) => {
      let temp = "";
      Array.from(new Array(idx)).map(() => {
        temp += item;
      });
      return `${item.toUpperCase()}${temp}-`;
    }).slice(0, -1);
};
console.log(accum("CHina"));
复制代码

怎么样, 最后几种方案看的是不是很刺激、很惊喜, 其实就是一堆奇葩操作, 这是 API 操作者的狂欢, 也是 JS 开发者的基本功^_^

这几个方案里面最令人惊喜的还是 replace , 当第二个参数是一个函数, 当第一个参数为正则表达式并且为全局匹配模式时, 这个方法每次匹配都会被调用。

replace 应该是正则的 6 个常用 API 中最强大的一个, 它可以拿到你想要的信息, 并且假借替换之名, 做一些神奇操作

传送门 -> 正则操作的6个常用方法( 字符串实例4个, 正则实例2个 )

注:

  1. \w 匹配单词字符, 等价于[0-9a-ZA-Z_], 数字字母下划线
  2. {1} 连续出现 1 次

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

UNIX编程艺术

UNIX编程艺术

[美] Eric S. Raymond / 姜宏、何源、蔡晓骏 / 电子工业出版社 / 2012-8 / 99.00元

《UNIX编程艺术》主要介绍了Unix系统领域中的设计和开发哲学、思想文化体系、原则与经验,由公认的Unix编程大师、开源运动领袖人物之一Eric S.Raymond倾力多年写作而成。包括Unix设计者在内的多位领域专家也为《UNIX编程艺术》贡献了宝贵的内容。《UNIX编程艺术》内容涉及社群文化、软件开发设计与实现,覆盖面广、内容深邃,完全展现了作者极其深厚的经验积累和领域智慧。一起来看看 《UNIX编程艺术》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具