正则获取一段文本中分隔符包裹的内容(如()、{}、[])

394 阅读1分钟

一、前言

项目中需要这样去处理配置的文本段落,因此需要做字符串的数据处理,还有初始化打乱数组顺序,因此做一下主要方法的记录。

二、方法

  1. 获取分隔符及包裹内容
/**
 * 获取所有分隔符及包裹单词
 *
 * @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
},
  1. 获取所有包裹、非包裹内容
/**
 *  获取所有包裹单词
 *
 * @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;
},
  1. 获取所有包裹内容
/**
 * 获取所有包裹单词
 *
 * @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"]
  1. 打乱数组顺序
/**
 * 打乱数组顺序
 *
 * @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中是不被允许的,所以需要替换成其他的方法。