「简记往来」开发历程系列:正则表达式从入门到实战——批量记礼的完整代码

「简记往来」开发历程系列:正则表达式从入门到实战——批量记礼的完整代码
一、正则基础语法5分钟入门正则表达式用于匹配文本中的特定模式。批量记礼中它用来从“张叔叔 800”这样的文本中提取出姓名和金额。常用元字符元字符含义示例\d数字\d匹配一个或多个数字\s空白字符\s匹配一个或多个空格\w字母/数字/下划线\w匹配单词^字符串开头^张匹配以“张”开头的行$字符串结尾800$匹配以“800”结尾的行[]字符集[姓名]匹配“姓”或“名”()捕获组(张叔叔)捕获“张叔叔”二、简记往来的完整正则代码批量记礼的核心解析函数functiontryParse(line){// 移除首尾空格lineline.trim()if(!line)returnnull// 尝试1标准“姓名 金额”// 匹配中文/英文姓名 空格 数字含小数letmatchline.match(/^([\u4e00-\u9fa5a-zA-Z·])\s([\d.])/)if(match){return{name:match[1].trim(),amount:parseFloat(match[2])}}// 尝试2无空格“姓名金额”// 匹配中文/英文姓名 数字无空格matchline.match(/^([\u4e00-\u9fa5a-zA-Z·])([\d.])/)if(match){return{name:match[1].trim(),amount:parseFloat(match[2])}}// 尝试3金额在末尾“任意内容 金额”// 匹配任意内容 末尾的数字matchline.match(/([\d.])$/)if(match){constnamePartline.replace(/([\d.])$/,).trim()if(namePart.length0){return{name:namePart,amount:parseFloat(match[1])}}}returnnull}三、5个常见踩坑点踩坑1中英文混排如果姓名包含英文如“John 500”[\u4e00-\u9fa5]匹配不到英文字母。解决方案加上a-zA-Z。踩坑2中间点少数民族姓名“阿不都·热合曼”中间的·需要用·匹配。解决方案加上·。踩坑3金额带千分位“1,000” 这种格式用[\d.]匹配不到逗号。解决方案先替换逗号再解析。踩坑4换行符不一致Windows用\r\nLinux/Mac用\n。解决方案统一用\n拆分再清理\r。踩坑5空行和多余空格用户可能输入空行或者行首行尾有多余空格。解决方案先trim()再判断是否为空。四、测试工具推荐regex101.com在线正则测试支持多种语言Chrome控制台张叔叔 800.match(/^([\u4e00-\u9fa5])\s(\d)/)Node.js REPL本地快速测试五、总结正则表达式不难关键是多测试、多迭代。简记往来的批量记礼功能从第一版到第五版就是不断发现新问题、不断改进的过程。如果你也在做文本解析建议先在regex101上测试通过再放到代码里。