Java中校验算术表达式合法性的正则写法正误求助
你写的正则存在多处语法错误,无法正确匹配非法字符,核心问题是字符组内的连字符-被错误用作范围运算符,同时存在多余的转义逻辑。
现存问题说明
- 字符组内
\\[-\\]、\\{-\\}、\\(-\\)的写法完全不符合需求:你本意是要匹配三类括号和减号,但实际这种写法会被正则解析为「匹配ASCII码在左括号和右括号之间的所有字符」,会包含大量你不需要的符号。 - 末尾多余的
-会进一步打乱字符组的匹配逻辑,导致匹配范围不可控。
正确实现方案
你要实现「匹配非法字符」的需求,正确的正则定义应该是:
Pattern p = Pattern.compile("[^0-9\\[\\]{}()+\\-*/\\s]");
逻辑说明
- 否定字符组
[^...]会匹配所有不在合法字符范围内的字符,只要调用p.matcher(表达式串).find()返回true,就说明存在非法字符,表达式不合法。 - 减号
-在这里做了转义处理\\-,避免被正则识别为范围运算符,你也可以选择把-放在字符组的最开头或者最末尾,不需要转义也能正常匹配字面量减号。
测试用例参考
测试用例1:合法表达式
2 * (3 + 5) - [6 / {7 + 8}]→ 无匹配结果,校验通过
测试用例2:含非法字符表达式10 ^ 2→ 匹配到^,校验不通过
测试用例3:含非法字符表达式a + 3→ 匹配到a,校验不通过
内容的提问来源于stack exchange,提问作者Bot Fred
相关产品推荐
相关产品推荐

