前言: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是一个较复杂的方法,我拆分出来的,将就点看吧😂