JsLib/StrTool.js

/**
 * 字符串工具类
 *
 * @class StrTool
 */
class StrTool {
  constructor() {}

  /**
   * @description 打印开始点
   *
   * @memberof StrTool
   */
  start() {
    console.log("字符串工具类StrTool start^_^_^_^_^_^_^_^_^_^")
  }

  /**
   * @description 打印结束点
   *
   * @memberof StrTool
   */
  end() {
    console.log("字符串工具类StrTool end^_^_^_^_^_^_^_^_^_^")
  }

  /**
   * @description 英文字母:
   * @description 字节数 : 1;编码:GB2312、GBK、GB18030、ISO-8859-1、UTF-8
   * @description 字节数 : 2;编码:UTF-16BE、UTF-16LE
   * @description 字节数 : 4;编码:UTF-16
   * @description 中文汉字:
   * @description 字节数 : 1;编码:SO-8859-1
   * @description 字节数 : 2;编码:GB2312、GBK、GB18030、UTF-16BE、UTF-16LE
   * @description 字节数 : 3;编码:UTF-8
   * @description 字节数 : 4;编码:UTF-16
   * @description https://developer.mozilla.org/zh-CN/docs/Web/API/Blob
   * @description 思路:利用Blob对象,默认编码是UTF-8(中文:3;英文:1)
   *
   * @description 返回字符串的字节长度(方法一)
   *
   * @param {String} str 目标字符串
   * @return {Number}  字节长度
   * @memberof StrTool
   * @example
   * byteSize('45 d s')   // 6
   * byteSize('文喝武喝 4s')   // 15
   */
  byteSize(str) {
    return new Blob([str]).size
  }

  /**
   * @description 思路:把中文字替换成两个字母。然后计算长度。
   * @description 这里正则要加/g,全部都要检查的意思。'2333哈哈' :没有的话输出的是(2333aa哈)
   *
   * @description 返回字符串的字节长度(方法二)
   *
   * @param {String} str 目标字符串
   * @param {number} [len=2]   一个中文要转换成几个字节(因为有的2,有的3)
   * @return {Number}
   * @memberof StrTool
   * @example
   * byteSize2('文喝武喝 4s'))   // 11
   * byteSize2('文喝武喝 4s', 3))   // 15
   * byteSize2('2333哈哈'))   // 8
   */
  byteSize2(str, len = 2) {
    const res = str.replace(/[\u4e00-\u9fa5]/g, "a".repeat(len)) // 匹配中文字符
    return res.length
  }

  /**
   * @description 思路:直接判断中文,长度+2
   * @description 这里正则可以不要加g
   * @description str.charAt(i): 获取i位置的字符(循环拿到每一个字符)
   *
   * @description 返回字符串的字节长度(方法三)
   *
   * @param {*} str
   * @param {number} [len=2]
   * @return {*}
   * @memberof StrTool
   * @example
   * byteSize3('2333哈哈')   // 8
   */
  byteSize3(str, len = 2) {
    let length = 0
    const reg = /[\u4e00-\u9fa5]/
    for (let i = 0; i < str.length; i++) {
      if (reg.test(str.charAt(i))) {
        length += len
      } else {
        length++
      }
    }
    return length
  }

  /**
   * @description 思路:利用Blob对象,默认编码是UTF-8(中文:3;英文:1)
   * 
   * @description 获取不同类型变量的字节长度
   *
   * @param {*} val 值/引用
   * @return {Number} 
   * @memberof StrTool
   * @example
   * typeSize('2333哈哈')   // 10
   * typeSize([1, 2, 3, 4, 5])   // 5
   * typeSize({ one: 1, two: 2, three: 3 })   // 3
   */
  typeSize(val) {
    return Array.isArray(val)
      ? val.length
      : val && typeof val === "object"
      ? val.size || val.length || Object.keys(val).length
      : typeof val === "string"
      ? new Blob([val]).size
      : 0
  }

  /**
   * @description [first, ...rest]:解耦字符串,可以把每个字符给输出出来,这样就可以拿到第一个字符
   *
   * @description 首字母大写
   *
   * @param {String} [first, ...rest] 目标字符串
   * @param {Number} [type=1]   1:小写;不传:大写
   * @return {String}
   * @memberof StrTool
   * @example
   * capitalize('azeze')   // Azeze
   * capitalize('azeZE')   // AzeZE
   * capitalize('Azeze', 1)   // azeze
   */
  capitalize([first, ...rest], type) {
    // console.log(first, ...rest)  // a z e z e
    const t = type === 1 ? first.toLowerCase() : first.toUpperCase()
    return t + rest.join("")
  }

  /**
   * @description \b 是正则表达式规定的一个特殊代码(好吧,某些人叫它元字符,metacharacter),代表着单词的开头或结尾,也就是单词的分界处
   * @description 例子:就用 "It's a nice day today." 举例说明:
   * @description 正则:\bnice\b
   * @description 分析:第一个 \b 前面一个字符是空格,后面一个字符是 'n',不全是 \w,所以可以匹配出 'n' 是一个单词的开头。
   * @description 第二个 \b 前面一个字符是 'e',后面一个字符是空格,不全是 \w,可以匹配出 'e' 是一个单词的结尾。所以,合在一起,就能匹配出以 'n' 开头以 'e' 结尾的单词,这里就能匹配出 "nice" 这个单词。
   *
   * @description 每个单词首字母大写
   *
   * @param {String} str 目标字符串
   * @return {String}
   * @memberof StrTool
   * @example
   * capitalizeEveryWord("hsd sd")   // Hsd Sd
   */
  capitalizeEveryWord(str) {
    return str.replace(/\b[a-z]/g, (char) => char.toUpperCase()) // char拿到的是 h和s
  }

  /**
   * @description \r:匹配一个回车符
   * @description ?:匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?
   * @description 使用String.prototype.split()和正则表达式匹配换行符并创建一个数组
   *
   * @description 将多行字符串拆分为行数组
   *
   * @param {String} str 目标数组
   * @return {Array}
   * @memberof StrTool
   * @example
   * splitLines('This\nis a\nmultiline\nstring.\n')   // ["This", "is a", "multiline", "string.", ""]
   */
  splitLines(str) {
    return str.split(/\r?\n/)
  }

  /**
   * @description 使用正则表达式从字符串中删除HTML / XML 标记。
   * @description html标签都是<xxx> 正则匹配就<[^>]:开头是<字符
   *
   * @description 删除字符串中的HTMl标签
   *
   * @param {String} str
   * @return {String}
   * @memberof StrTool
   * @example
   * stripHTMLTags('<p><em>lorem</em> <strong>ipsum</strong></p>')   // 'lorem ipsum'
   */
  stripHTMLTags(str) {
    return str.replace(/<[^>]*>/g, "")
  }
}

export default StrTool

// https://juejin.cn/post/6844903966526930951#heading-40:字符串第六点splitLines