用于检查数学表达式无效字符的正则表达式技术问询
计算器表达式非法字符校验解决方案
针对你遇到的正则校验问题,直接给出可落地的方案:
核心思路
只校验字符合法性,不关注表达式逻辑(括号匹配、操作数缺失等),核心是确保整个表达式的每一个字符都属于预定义的合法集合,同时处理多字符的函数名/常量(如tan、PI)。
解决步骤
定义合法Token集合
把允许的内容分成两类:- 多字符标识符:比如函数名
tan、sin、cos,常量PI、E - 单字符符号:操作符
+、-、*、/、%,括号(、),小数点.,空格,数字0-9
- 多字符标识符:比如函数名
构造正则表达式
关键是优先匹配多字符Token(避免被拆成单个字母),同时用^和$锚定整个字符串,确保所有字符都被校验:^(?:tan|sin|cos|PI|E|[+\-*/%()\s.]|\d)*$解释:
^/$:强制匹配整个字符串,杜绝“只匹配部分合法字符就通过”的问题tan|sin|cos|PI|E:先匹配完整的多字符标识符,防止tan被拆成t、a、n单独匹配[+\-*/%()\s.]:匹配所有合法单字符符号(\s包含空格)\d:匹配数字*:允许空表达式(如果要禁止空串,改成+)
通用化扩展
要新增函数/常量时,直接修改多字符Token列表即可,无需改动正则结构。比如用Python动态生成正则:# 可扩展的合法多字符Token列表 valid_multi_tokens = ['tan', 'sin', 'cos', 'PI', 'E', 'log', 'sqrt'] # 合法单字符集合 valid_single_chars = r'[+\-*/%()\s.\d]' # 动态生成正则 pattern = f"^(?:{'|'.join(valid_multi_tokens)}|{valid_single_chars})*$"
测试验证
- 合法示例全部匹配:
3 + 10、tan(45 * PI / 180)、5 % 10、5 + 3 * ( 2 - 非法示例不匹配:
3 + #(#不在合法集合中)
内容的提问来源于stack exchange,提问作者medreres
相关产品推荐
相关产品推荐

