零宽断言正则表达式替换方案

news2025/1/16 20:53:00

一、背景

safari浏览器不支持零宽断言正则表达式

二、解决方案

使用其他正则替换零宽断言正则(包含:(?<=)正向肯定预查、(?<!)正向否定预查、(?=)反向肯定预查、(?!)反向否定预查)

三、涉及场景

1、仅校验,不取值

如表单正则校验,如editor\src\editor\Editor\constant\todoPropsList.js:2093,此类场景可能需要重新编写(改动可能较大)正则, 无需经过zeroWidthRegPolyfill方法

 

2、校验,并取值

2.1、正则表达式不含g

如packages\editor\src\CompEvent\hooks\useFunctionValue.tsx:17,需注意改写表达式后,后续取值可能会跟随分组而变化,无需经过zeroWidthRegPolyfill方法

2.2、正则表达式含g

如editor\src\editor\Editor\components\pageDetail\CodeMirrorModal\CodeMirrorModal.jsx:87,将正则/(?<=actionMap(\['|\[|\.))[^.[\s"']+?(?==|\s|'|])/g,改为/actionMap(\['|\[|\.)([^.[\s"']+?)(=|\s|'|])+?/g ,使用zeroWidthRegPolyfill方法处理

317b31f155d70bbca54a2fd20497fe47.png

四、方法使用说明

涉及方法(主要处理正则含g的正则表达式):

packages\editor\src\utils\common.ts -> zeroWidthRegPolyfill(str, reg, n=1)

const zeroWidthRegPolyfill = (str, reg, n = 1) => {
  let result = null;
  const originRegStr = reg.toString();
  const regStr = originRegStr.replace(/^\/(.*)+?(\/|\/g)$/, '$1');
  const regWithoutG = new RegExp(regStr);
  if (originRegStr.endsWith('g')) {
    const arr = str.match(reg);
    if (!arr) {
      return result;
    }
    result = [];
    arr.forEach((it) => {
      result.push(it?.match(regWithoutG)?.[n]);
    });
  } else {
    result = str.match(regWithoutG);
  }
  return result;
};

1、reg含g,入参为校验字符串str、不含零宽的正则reg,以及需要真正匹配获取的字符所在的分组(必须对需要获取的字符分组)的序号n。str.match(reg)返回含目标字符的字符串数组,需要通过it?.match(regWithoutG)?.[n]二次处理,返回仅含目标字符的字符串数组

1.1、至于为啥要二次处理,这里需要知道match的使用及返回值,以下做简要对比:

 1.2、当然,使用matchAll能够一次性获取所有的匹配,并且返回带有分组信息的数组,但ie浏览器不支持

 

2、如传入不含g的表达式,则效果等同str.match(reg)。

3、使用该方法与零宽断言的区别

先看案例:

 

 可以发现,零宽实现匹配了3个结果,非零宽匹配了2个结果,这是因为“零宽正则”匹配完了之后,会从匹配到的字符开始继续匹配,预查不消耗字符

一般场景,其实是需要消耗字符的。但是,如果需要完全与零宽正则相匹配,则需要使用升级版方法。

const zeroWidthRegPolyfillPlus = (str, reg, n = 1) => {
  let result = null;
  const originRegStr = reg.toString();
  const regStr = originRegStr.replace(/^\/(.*)+?(\/|\/g)$/, '$1');
  const regWithoutG = new RegExp(regStr);
  let hasMatch = true;
  // 实现零宽预查补偿消耗字符,循环匹配
  // const loopReg = (_str, res) => {
  //   hasMatch = false;
  //   const nextStr = _str.replace(regWithoutG, function () {
  //     hasMatch = true;
  //     res.push(arguments[n]);
  //     return arguments[n + 1];
  //   });
  //   if (hasMatch) {
  //     loopReg(nextStr, res);
  //   }
  // };
  if (originRegStr.endsWith('g')) {
    result = [];
    // 实现补偿方法一:
    // loopReg(str, result);
    // 实现补偿方法二:
    let nextStr = str;
    while (hasMatch) {
      hasMatch = false;
      nextStr = nextStr.replace(regWithoutG, function () {
        hasMatch = true;
        result.push(arguments[n]);
        return arguments[n + 1];
      });
    }
  } else {
    result = str.match(regWithoutG);
  }
  return result;
};

// 目标:查找$$之间包裹的所有字符串
const str = '$abc$d$ef$';
// 1、零宽实现
const regZero = /(?<=\$).*?(?=\$)/g;
let result = str.match(regZero);
console.log('result1:', result);
// 返回 result = ['abc', 'd', 'ef']
// 此处需要将正向肯定预查进行分组,以便方法中能够将预查的字符消耗重新补上
const reg = /\$(.*?)(\$)/g;

result = zeroWidthRegPolyfillPlus(str, reg);
console.log('result2:', result);
// 返回 result = ['abc', 'd', 'ef']

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/145080.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

首汽约车驶向极速统一之路!出行平台如何基于StarRocks构建实时数仓?

作者&#xff1a;王满&#xff0c;高级数据架构工程师首汽约车&#xff08;以下简称 “首约”&#xff09;是首汽集团为响应交通运输部号召&#xff0c;积极拥抱互联网&#xff0c;推动传统出租车行业转型升级&#xff0c;加强建设交通强国而打造的网约车出行平台。 在用车服务…

KernelSU: 内核 ROOT 方案, KernelSU KernelSU KernelSU 新的隐藏root防止检测 封号方案

大约一年多以前&#xff0c;我在一篇讲Android 上 ROOT 的过去、现在和未来https://mp.weixin.qq.com/s?__bizMjM5Njg5ODU2NA&mid2257499009&idx1&sn3cfce1ea7deb6e0e4f2ac170cffd7cc1&scene21#wechat_redirect 的文章中提到&#xff1a; 我认为&#xff0c;随…

三菱FX5U 多个表格运行指令 DRVTBL

简述该指令可以用GX Works3预先在表格数据中设定的控制方式的动作&#xff0c;&#xff08;连续或步进&#xff09; 执行多行。 本文演示了步进执行多行。指令解释2.1梯形图中的指令第一个参数&#xff1a;输出脉冲的轴编号 &#xff0c;K1,K2,K3,K4... 第二个参数&#xff1a;…

ESP8266 Windows开发环境搭建(IDE1.5)好用不骗人

最近一个项目需要用ESP8266&#xff0c;找了很多文章进行环境搭建编译都很问题&#xff0c;不是make Menuconfig 不出来&#xff0c;就是编译报错&#xff0c;现总结如下。 我在自己电脑上没弄出来&#xff0c;就安装了一个虚拟机很干净的环境没有其它开发环境影响。 提前去官…

逆向入门|全国建筑市场监管公共服务平台JS逆向

看了志远的公开课&#xff0c;自己做一下练手。 全国建筑市场监管公共服务平台&#xff08;四库一平台&#xff09; 先点到 数据这里打开f12看一眼 第一个就是 https://jzsc.mohurd.gov.cn/api/webApi/dataservice/query/comp/list?pg1&pgsz15&total450 取这个地址…

线段树讲解

0、引入 假设给定一个长度为 1001 的数组&#xff0c;即下标 0 到 1000。 现在需要完成 3 个功能&#xff1a; add(1, 200, 6); //给下标 1 到 200 的每个数都加 6&#xff1b; update(7, 375, 4); //下标 7 到 375 的数全部修改为 4 query(3, 999); //下标 3 到 999 所有数…

深入理解如何利用PWM驱动舵机:ESP32驱动DS1115舵机

深入理解如何利用PWM驱动舵机&#xff1a;ESP32驱动DS1115舵机DS1115舵机技术规格举例说明之前做了一个项目&#xff0c;关于ESP32驱动DS1115舵机&#xff0c;但是在项目运行的过程中由于学艺不精&#xff0c;导致电机抽搐 &#x1f635;‍&#x1f4ab;&#xff0c;所以特意拜…

声纹识别可靠评测

分享嘉宾 | 李蓝天 文稿整理 | William 1 Introduction 声纹识别的发展&#xff0c;非常迅猛&#xff0c;在一些基准上取得了不错的效果&#xff0c;但如果将其部署到一个实际的应用系统里面&#xff0c; 从应用方的反馈来看&#xff0c;纹识别在很多场景里的鲁棒性并不理想。…

聚观早报 | 亚马逊将裁员17000人;苹果砍单MacBook等产品线架构

今日要闻&#xff1a;亚马逊将裁员17000人&#xff1b;苹果砍单MacBook等产品线&#xff1b;京东科技调整组织架构&#xff1b;小米x徕卡团队获技术大奖&#xff1b;必应搜索或将纳入ChatGPT亚马逊将裁员17000人 1 月 5 日消息&#xff0c;知情人士称&#xff0c;亚马逊新一轮裁…

正版授权|FastStone Capture 专业屏幕截图录屏工具软件 商业版,支持商业用途。

现在截图对每个人来说都是一个必不可少的功能。QQ软件截图、360游览器截图等都是相对简单快速的途径。但是如果你对截图有更多的要求&#xff0c;那么这里推荐一款截图软件&#xff0c;它就是FastStone Capture。这个对于商城老用户来说&#xff0c;几乎是接近人手一份。强大的…

【VUE3】保姆级基础讲解(六)Axios库

目录 Axios介绍与原生的差异 发送常见的请求和配置选项 1、发送request请求 baseURL &#xff1a; 2、发送get请求 3、发送post请求 axios.all Axios创建新的实例 请求和响应拦截 请求拦截 响应拦截 Axios介绍与原生的差异 Axios其实就是一个网络请求库 与原生的差异&…

勇夺中国市场豪华品牌第一名后,特斯拉S3XY全系售价调整

比你优秀的人比你更努力&#xff0c;用这句话形容特斯拉最贴切不过。 刚刚过去的2022年&#xff0c;特斯拉在海内外市场交出了亮眼答卷&#xff1a;全球共计交付产品超131万辆&#xff0c;同比增长40%&#xff1b;乘联会给出的数据显示&#xff0c;上海超级工厂全年交付71.1万辆…

不止IVAS,微软Azure也在布局这些军事模拟场景

一提起微软在军事领域的应用&#xff0c;我们第一印象可能是美军以220亿美元采购HoloLens 2 AR头显的项目&#xff0c;这个项目后期由于AR光学和设计方面受限&#xff0c;正式应用的日期一直再推迟。实际上&#xff0c;微软除了向美军提供HoloLens外&#xff0c;还提供了基于云…

Unity 3D GUI 简介||OnGUI Button 控件

游戏开发过程中&#xff0c;开发人员往往会通过制作大量的图形用户界面&#xff08; Graphical User Interface&#xff0c;GUI &#xff09;来增强游戏与玩家的交互性。 Unity 3D 中的图形系统分为 OnGUI、NGUI、UGUI等&#xff0c;这些类型的图形系统内容十分丰富&#xff0…

第05章 数组、排序和查找

数组 基本介绍 数组可以存放多个同一类型的数据&#xff0c;数组也是一种数据类型&#xff0c;是引用类型。 即&#xff1a;数组就是一组数据。 数组的使用 1、数组的定义 方法一&#xff1a; 数据类型[] 数组名 new 数据类型[大小] 说明&#xff1a;int[] a new int[5…

【C++ Primer】阅读笔记(5):vector|迭代器|数组

目录 简介参考结语简介 Hello! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~ ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金,有幸在竞赛中拿过一些国奖、省奖…已保研 学习经验:…

数图互通高校房产管理——CAD图形管理

数图互通房产管理系统在这方面做得比较全面&#xff1b; 支持通过建筑物的楼层CAD图查看房间属性和使用信息&#xff0c;实现图数结合、以图管房、图数互查、数图互通、图文一体化。 1.1支持客户端和AutoCAD无缝集成 支持客户端和AutoCAD无缝集成&#xff0c;实现在客户端/Aut…

Acwing---796.子矩阵的和

子矩阵的和1.题目2.基本思想3.代码实现1.题目 输入一个n行m列的整数矩阵&#xff0c;再输入q个询问&#xff0c;每个询问包含四个整数1&#xff0c;y1&#xff0c;2&#xff0c;y2&#xff0c;表示一个子矩阵的左上角坐标和右下角坐标。 对于每个询问输出子矩阵中所有数的和。…

质性分析软件nvivo的学习(三)

0、前言&#xff1a; 这部分内容是&#xff0c;质性分析软件nvivo的学习&#xff08;二&#xff09;的衔接内容&#xff0c;建议看完&#xff1a;质性分析软件nvivo的学习&#xff08;一&#xff09;&#xff08;二&#xff09;再看这部分内容。这里的笔记都是以nvivo12作为学…

高成长、高潜力、高社区影响,达坦科技入选 2022 中国新锐技术先锋企业

2023 年 1 月 4日&#xff0c;中国技术先锋年度评选 | 2022 中国新锐技术先锋企业榜单正式发布。作为中国领先的新一代开发者社区&#xff0c;SegmentFault 思否依托数百万开发者的用户数据分析&#xff0c;各科技企业在国内技术领域的行为及影响力指标&#xff0c;最终评选出 …