简介
Convert a camelized string into a lowercased one with a custom separator.
看简介我们知道 decamelize 这个包主要是用来分隔字符串。
官方例子:
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,脚本略。
总结
作者很聪明的利用正则组的用法,把一个简单的分隔功能做到了简单化,让我再次体会到正则的牛掰。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。