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