当前位置: 首页 > news >正文

TypeScript 开发实战:如何安全替换字符串中的关键字

在 TypeScript 开发中,我们经常需要处理字符串替换的场景。最近我在开发一个表达式解析功能时,遇到了一个有趣的挑战:如何将用户输入的简化数学表达式(如"sin")替换为标准形式(如"Math.sin"),同时避免错误的子串替换。本文将详细介绍这个问题的解决方案。

问题背景

我想为用户提供简化的数学表达式写法,例如:

  • "sin" → "Math.sin"

  • "clamp01" → "mkFun.clamp01"

最初我使用了一个简单的替换字典和循环:

    static dicMapExpress:Dictionary<string> = {["E"]:"Math.E",["PI"]:"Math.PI",["asin"]:"Math.asin",["acos"]:"Math.acos",["atan"]:"Math.atan",["sin"]:"Math.sin",["cos"]:"Math.cos",["tan"]:"Math.tan",["trunc"]:"Math.trunc",["abs"]:"Math.abs",["ceil"]:"Math.ceil",["floor"]:"Math.floor",["round"]:"Math.round",["pow"]:"Math.pow",["sqrt"]:"Math.sqrt",["exp"]:"Math.exp",["log"]:"Math.log",["clamp01"]:"mkFun.clamp01",["clamp"]:"mkFun.clamp",["lerp"]:"mkFun.lerp"};for (const key in dicMapExpress) {this.express = this.express.replace(key, dicMapExpress[key]);}

但这种方法存在严重问题:

  1. "clamp01" 会被先替换为 "mkFun.clamp01",然后其中的 "clamp" 又被替换为 "mkFun.clamp"

  2. "asin" 中的 "sin" 会被单独替换

  3. 替换顺序不可控

解决方案

方案一:正则表达式精确匹配

for (const key in dicMapExpress) {const regex = new RegExp(`\\b${key}\\b`, 'g');this.express = this.express.replace(regex, dicMapExpress[key]);
}

优点

  • 使用单词边界(\b)确保只匹配完整单词

  • 解决子串误替换问题

  • 代码简洁明了

注意事项

  • 如果key中包含正则特殊字符需要转义

  • 默认区分大小写,如需忽略大小写可加i标志

方案二:高阶正则合并替换

const regex = new RegExp(`\\b(${Object.keys(dicMapExpress).join('|')})\\b`, 'g'
);
this.express = this.express.replace(regex, match => dicMapExpress[match]);

优点

  • 只需一次字符串遍历,性能更高

  • 同样解决子串误替换问题

  • 适合大规模替换场景

注意事项

  • 正则表达式可能较长

  • 需要处理特殊字符转义

总结

在TypeScript中进行安全的字符串替换时,简单的字符串替换往往会带来隐藏的问题。通过使用正则表达式的单词边界匹配,我们可以优雅地解决这些问题。对于性能敏感的场景,可以考虑使用合并后的正则表达式进行一次性替换。

记住:在字符串处理中,精确匹配比简单替换更重要!

 

相关文章:

  • 阿里云99机器总是宕机,实测还是磁盘性能差
  • 多路转接epoll原理详解
  • 应用信息1.13.0发布
  • verilog和system verilog常用数据类型以及常量汇总
  • SVN钩子脚本获取日志中文乱码解决办法
  • Android 混合开发实战:统一 View 与 Compose 的浅色/深色主题方案
  • 嵌入模型(Embedding Models)原理详解:从Word2Vec到BERT的技术演进
  • MyBatis操作数据库---从入门到理解
  • 硬件工程师面试常见问题(7)
  • LeetCode-Hot100
  • CentOS 7 磁盘分区详细教程
  • 【框架学习】Spring AI-功能学习与实战(一)
  • SpringBoot | 构建客户树及其关联关系的设计思路和实践Demo
  • 【CAPL实战:以太网】对IPv4报文的Payload部分进行分片并创建分片包
  • Vue 的单文件组件(.vue 文件)script 标签的使用说明
  • AI赋能安全调度系统:智能升级与功能跃迁
  • KMS工作原理及其安全性分析
  • Leetcode19(亚马逊真题):删除链表的倒是第N个节点
  • 特征存储的好处:特征存储在机器学习开发中的优势
  • dumpsys activity activities中的Task和ActivityRecord信息解读
  • 王宝强谈《棋士》:饰演这个灰度人物有一种被割裂的痛苦
  • 涡虫首上太空,神舟二十号任务将开展3项生命科学实验
  • 特朗普:无意解雇鲍威尔,但美联储应该降低利率
  • 夜读丨秦腔里的乡魂
  • 视频·世界读书日|林乾:碎片化阅读或影视综艺≠知识
  • 规模再创新高,超百款新车首发!上海车展明日开幕