news 2026/7/3 17:22:55

「 简记往来」第十篇:批量记礼——正则表达式的5次迭代

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
「 简记往来」第十篇:批量记礼——正则表达式的5次迭代

一、一个“看起来很简单”的功能

简记往来最受欢迎的功能之一是“批量记礼”。

用户把纸上的礼单敲成文本,一次性粘贴进去:

张叔叔 800 李阿姨 500 表哥 1000

系统自动解析出姓名和金额,一次性生成所有记录。

看起来很简单,对吧?

但实际上,这个功能的正则表达式写了5版才稳定。

二、第一版:只支持“姓名 金额”

第一版我写了一个最简单的正则:

constreg=/^([^\d\s]+)\s+(\d+)$/

逻辑:匹配“非数字非空格的字符(姓名)+ 至少一个空格 + 数字(金额)”。

上线后,用户反馈来了:

“我输入‘张叔叔800’为什么解析不了?”

“我输入‘表哥1000.00’为什么报错?”

“我输入‘李阿姨500(婚礼)’怎么办?”

第一版只支持最完美的“姓名 空格 金额”格式,但用户的真实输入五花八门。

三、第二版:支持无空格

既然用户可能不敲空格,那就让正则支持“姓名金额”的格式:

constreg=/^([^\d]+)\s*(\d+(?:\.\d+)?)$/

改动点:

  • \s*让空格变成“可有可无”
  • (\d+(?:\.\d+)?)支持了带小数的金额

支持了“张叔叔800”,但“王二小800”又成了新问题——正则把“二”也当成了数字的一部分。

四、第三版:明确匹配中英文

第三版用更精确的字符集替换了“排除数字”的偷懒写法:

constmatch=line.match(/^([\u4e00-\u9fa5a-zA-Z·]+)\s*([\d.]+)/)

改动点:

  • [\u4e00-\u9fa5a-zA-Z·]+明确匹配中文、英文和中间点(少数民族姓名)
  • 不再用“排除数字”这种偷懒写法

这次稳定了很多,但“李阿姨500(婚礼)”这种带备注的还是不行。

五、第四版:逐行独立解析 + 多格式尝试

第四版换了思路:逐个尝试不同的格式,哪个能匹配就用哪个。

functiontryParse(line){line=line.trim()// 尝试1:标准“姓名 金额”letmatch=line.match(/^([\u4e00-\u9fa5a-zA-Z·]+)\s+([\d.]+)/)if(match)return{name:match[1].trim(),amount:parseFloat(match[2])}// 尝试2:无空格“姓名金额”match=line.match(/^([\u4e00-\u9fa5a-zA-Z·]+)([\d.]+)/)if(match)return{name:match[1].trim(),amount:parseFloat(match[2])}// 尝试3:金额在末尾“任意内容 金额”match=line.match(/([\d.]+)$/)if(match){constnamePart=line.replace(/([\d.]+)$/,'').trim()if(namePart.length>0){return{name:namePart,amount:parseFloat(match[1])}}}returnnull}

这次覆盖了大部分场景,但个别边缘情况仍然解析失败。

六、第五版:容错 + 预览编辑

最终版的核心逻辑:

functionparseBatch(text){constlines=text.split('\n').filter(l=>l.trim())constresults=[]for(constlineoflines){constparsed=tryParse(line)if(parsed){results.push(parsed)}else{// 解析失败,标记为“待修正”results.push({error:true,raw:line,name:'',amount:null})}}returnresults}

同时在前端做了防抖处理——用户停止输入300ms后才触发解析,避免频繁计算。

核心教训:不要追求一次性完美解析。给用户预览和修正的机会,比追求100%准确更重要。

第一版追求完美,结果连50%的输入都覆盖不了;第五版接受“不完美”,反而覆盖了95%以上的真实输入场景。

七、5次迭代的总结

版本策略结果
第一版只支持“姓名 金额”覆盖<50%,用户抱怨
第二版支持无空格覆盖约70%,中文数字问题
第三版明确匹配字符集覆盖约80%,备注问题
第四版多格式尝试覆盖约90%,边缘问题
第五版容错+预览编辑覆盖>95%,用户可修正

八、经验教训

不要试图用一个正则覆盖所有场景。先把80%的常见场景处理好,剩下的通过产品设计让用户自己修正。

用户需要的是“帮我省90%的力,剩下10%我自己来”,而不是“100%完美但只能处理50%的场景”。

下一篇,我们来聊聊批量记礼的防抖与预览编辑设计。

评论区聊聊:你处理用户输入不规范时,用了什么方案?

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/3 17:19:30

AI教材编写新利器!低查重AI写教材工具,快速生成专业教材框架

谁没有在编写教材时感到过迷茫呢&#xff1f; 面对空白的文档&#xff0c;我们常常会发愣好一阵子&#xff0c;思考知识点的排列顺序——首先是讲解概念&#xff0c;还是直接给出案例&#xff1f;章节的划分应该遵循逻辑框架&#xff0c;还是要依据课时安排&#xff1f;即使进…

作者头像 李华
网站建设 2026/7/3 17:19:10

基于TPA3128D2与STM32的高效数字功放系统设计

1. 项目概述&#xff1a;打造高保真数字功放系统在音频设备开发领域&#xff0c;D类功放因其高效率和小型化特点&#xff0c;已成为便携式和嵌入式系统的首选方案。本项目基于TI的TPA3128D2数字功放芯片与ST的STM32F217ZG微控制器&#xff0c;构建了一套支持数字音频处理的高性…

作者头像 李华
网站建设 2026/7/3 17:10:58

项目总览与架构地图

1. 项目总览与架构地图所属分组&#xff1a;架构总览## 概述本系列文章聚焦于对 Claude Code 源码的解读。Claude Code 是 Anthropic 推出的一款基于终端的 AI 编程助手 CLI 工具&#xff0c;它将大语言模型能力深度嵌入到开发者的命令行工作流中&#xff0c;支持交互式 REPL、…

作者头像 李华
网站建设 2026/7/3 17:08:34

VisualCppRedist AIO:告别Windows软件兼容性问题的终极修复方案

VisualCppRedist AIO&#xff1a;告别Windows软件兼容性问题的终极修复方案 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过新下载的游戏无法启…

作者头像 李华
网站建设 2026/7/3 17:03:59

为什么高并发的企业微信API AI助手架构难做?

在企业数字化协同的深水区&#xff0c;将大语言模型&#xff08;LLM&#xff09;与企业微信生态深度融合&#xff0c;打造一个支持高并发、多群组上下文隔离、挂载企业私有知识库&#xff08;RAG&#xff09;的“智能 AI 助手”&#xff0c;已成为中大型企业构建数字化知识中台…

作者头像 李华
网站建设 2026/7/3 17:02:02

3步掌握MDUT数据库利用工具:从入门到高效实战

3步掌握MDUT数据库利用工具&#xff1a;从入门到高效实战 【免费下载链接】MDUT MDUT - Multiple Database Utilization Tools 项目地址: https://gitcode.com/gh_mirrors/md/MDUT MDUT&#xff08;Multiple Database Utilization Tools&#xff09;是一款中文的数据库跨…

作者头像 李华