一、前言
项目中需要这样去处理配置的文本段落,因此需要做字符串的数据处理,还有初始化打乱数组顺序,因此做一下主要方法的记录。
二、方法
- 获取分隔符及包裹内容
/**
* 获取所有分隔符及包裹单词
*
* @param {string} text
* @param {string} wrapStr
* @param {number} [baseNum=1]
* @return {*}
*/
getWrapsAndWords(text: string, wrapStr: string, baseNum: number = 1) {
let prevWrapStr = `\\${wrapStr.substr(0, 1)}`.repeat(baseNum);
let backMarkStr = `\\${wrapStr.substr(-1)}`.repeat(baseNum);
const regexp = new RegExp(`${prevWrapStr}(.+?)${backMarkStr}`, 'g')
let res = text.match(regexp)
return res
},
- 获取所有包裹、非包裹内容
/**
* 获取所有包裹单词
*
* @param {string} text // 文本段
* @param {string} wrapStr // 分隔符字符串 => '{}', '{{}}'
* @param {number} [baseNum=1] // 分隔符重复次数 => {}: 1, {{}}: 2 以此类推
* @return {*}
*/
getWrapWords(text: string, wrapStr: string, baseNum: number = 1) {
let prevWrapStr = `\\${wrapStr.substr(0, 1)}`.repeat(baseNum);
let backMarkStr = `\\${wrapStr.substr(-1)}`.repeat(baseNum);
const regexp = new RegExp(`(?<=${prevWrapStr})[^\\${backMarkStr}]+`, 'g');
const res = text.match(regexp);
// 无匹配
if (res === null) {
return [];
}
return res;
},
- 获取所有包裹内容
/**
* 获取所有包裹单词
*
* @param {string} text // 文本段
* @param {string} mark // 分隔符字符串 => '{}', '{{}}'
* @param {number} [baseNum=1] // 分隔符重复次数 => {}: 1, {{}}: 2 以此类推
* @return {*}
*/
getMarkInner(text: string, mark: string, baseNum: number = 1) {
let prevMark = `\\${mark.substr(0, 1)}`.repeat(baseNum);
let backMark = `\\${mark.substr(-1)}`.repeat(baseNum);
const cardReg = new RegExp(`(?<=${prevMark})[^\\${backMark}]+`, 'g');
const cardMatches = text.match(cardReg);
if (cardMatches === null) {
return [];
}
return cardMatches;
},
const words = getMarkInner('Hi, Gary, how are {doing} ?', '{}')
console.log(words)
// ["doing"]
- 打乱数组顺序
/**
* 打乱数组顺序
*
* @param {*} arr // 源数组
* @return {*}
*/
shuffle(arr: Array<string>): Array<string> {
let i = arr.length;
while (i) {
let j = Math.floor(Math.random() * i--);
[arr[j], arr[i]] = [arr[i], arr[j]];
}
return arr;
},
三、扩展
在不同的运行环境,对代码正则部分的校验也是有区分的,使用零宽断言在安卓上可以,在ios中是不被允许的,所以需要替换成其他的方法。