iOS&Safari不兼容正则表达式的断言匹配及解决办法

前言:PC端谷歌、安卓手机正常运行;Safari、iPhone报错:SyntaxError: Invalid regular expression: invalid group specifier name

介绍:

正则表达式零宽断言一共四种:

在这里插入图片描述

通俗理解

  • (?=pattern):后面是什么
  • (?!pattern):后面不是什么
  • (?<=pattern):前面是什么
  • (?<!pattern):前面不是什么

题型:

参数:content-string类型
方法逻辑:
content长这样:“return ‘1’ === getAnswerById(‘b23ac55e-9265-45a6-ba1b-e18ba7732813’) && ‘2’ === getAnswerById(‘ec35748b-16fa-4d4a-96a1-118cf2910d11’)”,里面会有若干个getAnswerById(xxx)这样的方法。把字符串里的所有getAnswerById(xxx)的xxx抠出来,放在一个数组里返回
返回:抠出来的xxx数组
零宽断言:

interface findStringResult {
    idArr: string[]
}

function findString(content: string, methodName: string): findStringResult {
    const regexId: RegExp = new RegExp("(?<=(" + methodName + "\\((\\'|\\\"))).*?(?=(\\'|\\\")\\))", 'g');
    return { idArr: content.match(regexId) || [] };
}

function getIdsFromString(content: string): string[] {
    let idsArr: string[] = [];
    let targetObj: { idArr: string[] } = findString(content, 'getAnswerById');
    targetObj.idArr.forEach(item => {
        return idsArr.includes(item) ? false : idsArr.push(item)
    });
    return idsArr;
}

const str:string = "return '1' === getAnswerById('b23ac55e-9265-45a6-ba1b-e18ba7732813') && '2' === getAnswerById('ec35748b-16fa-4d4a-96a1-118cf2910d11')"
console.log(getIdsFromString(str)); // ['b23ac55e-9265-45a6-ba1b-e18ba7732813','ec35748b-16fa-4d4a-96a1-118cf2910d11']

兼容方案:

interface findStringResult {
    idArr: string[]
}

function findString(content: string, methodName: string): findStringResult {
    const regexId: RegExp = new RegExp("(" + methodName + "\\((\\'|\\\").*?(\\'|\\\")\\))", 'g')
    let idArr: string[] = content.match(regexId) || []

    if (idArr.length) {
        // 需要判断方法里面的是单引号还是双引号
        let quotes: string = -1 === idArr[0].indexOf("'") ? '"' : "'";
        idArr = idArr.map(idItem => {
            return idItem.split(quotes)[1];
        })
    }

    return { idArr: idArr };
}

function getIdsFromString(content: string): string[] {
    let idsArr: string[] = [];
    let targetObj: { idArr: string[] } = findString(content, 'getAnswerById');
    targetObj.idArr.forEach(item => {
        return idsArr.includes(item) ? false : idsArr.push(item)
    });
    return idsArr;
}

const str:string = "return '1' === getAnswerById('b23ac55e-9265-45a6-ba1b-e18ba7732813') && '2' === getAnswerById('ec35748b-16fa-4d4a-96a1-118cf2910d11')"
console.log(getIdsFromString(str)); // ['b23ac55e-9265-45a6-ba1b-e18ba7732813','ec35748b-16fa-4d4a-96a1-118cf2910d11']

拓展:双斜杠解读,两步走:

\. 与 \\. 的区别
\.  第一步:被编译器解释为.   第二步:被正则表达式解释为匹配除换行符(\n、\r)之外的任何单个字符。
\\. 第一步:被编译器解释为\.  第二步:被正则表达式解释为.

demo是一个较复杂的方法,我拆分出来的,将就点看吧😂

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值