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

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

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

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

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 次

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

查看所有标签

猜你喜欢:

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

Web Form Design

Web Form Design

Luke Wroblewski / Rosenfeld Media / 2008-5-2 / GBP 25.00

Forms make or break the most crucial online interactions: checkout, registration, and any task requiring information entry. In Web Form Design, Luke Wroblewski draws on original research, his consider......一起来看看 《Web Form Design》 这本书的介绍吧!

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具