【大吉大利 今晚吃包】003 - decamelize

簡介

Convert a camelized string into a lowercased one with a custom separator.

看簡介咱們知道 decamelize 這個包主要是用來分隔字符串。git

官方例子:github

const decamelize = require('decamelize');
 
decamelize('unicornRainbow');
//=> 'unicorn_rainbow'
 
decamelize('unicornRainbow', '-');
//=> 'unicorn-rainbow'

目錄結構

略。框架

主要代碼

'use strict';
const xRegExp = require('xregexp');

/**
 * @param {string} text      文本
 * @param {string} separator 分隔符
 */
module.exports = (text, separator) => {
  if (typeof text !== 'string') {
    throw new TypeError('Expected a string');
  }

  separator = typeof separator === 'undefined' ? '_' : separator;

  const regex1 = xRegExp('([\\p{Ll}\\d])(\\p{Lu})', 'g');
  const regex2 = xRegExp('(\\p{Lu}+)(\\p{Lu}[\\p{Ll}\\d]+)', 'g');

  return text
  .replace(regex1, `$1${separator}$2`)
  .replace(regex2, `$1${separator}$2`)
  .toLowerCase();
};

其實比較複雜的字符串處理都要用到正則,這裏也不例外,做者用了一個 xregexp 的第三方正則拓展庫,而核心代碼主要是
([\p{Ll}\d])(\p{Lu})(\p{Lu}+)(\p{Lu}[\p{Ll}\d]+) 這兩句正則,單元測試

這兩句正則講人話就是:
(組1:匹配小寫字母)(組2:匹配大寫字母) and (組1:匹配連續的大寫字母)(組2:匹配小寫字母)
這樣咱們就能看懂了,把匹配的的內容替換成 組1 + 分隔符 + 組2,這樣就起到了對原字符串分隔的做用。測試

單元測試

測試框架用的 ava,腳本略。ui

總結

做者很聰明的利用正則組的用法,把一個簡單的分隔功能作到了簡單化,讓我再次體會到正則的牛掰。spa

相關文章
相關標籤/搜索