Java校验含循环的特殊格式字符串及命令解析问题咨询
针对事实/规则命令解析与格式校验的解决方案
嘿,我之前也做过类似的规则引擎小项目,给你分享几个实用的解决思路,应该能帮你搞定当前的问题:
一、先把格式校验的规则落地
首先得把用户允许的命令格式明确枚举并固化,别模棱两可,比如:
- 添加事实:
+ [事实内容](举个例子:+ 猫是哺乳动物) - 添加规则:
+ [前提条件] -> [推导结论](比如:+ 猫是哺乳动物 -> 猫是恒温动物) - 删除事实:
- [事实内容] - 删除规则:
- [前提条件] -> [推导结论]
然后针对每种格式写对应的正则表达式做校验,这样能快速过滤无效输入:
- 事实类命令的正则:
^[+-]\s+.+$(简单版,你可以根据需求细化,比如限制事实内容的字符范围) - 规则类命令的正则:
^[+-]\s+.+\s->\s.+$(这里默认->前后有空格,如果允许无空格,就改成^[+-]\s+.+->.+$)
二、重构parseCommand方法,拆分逻辑
别把所有逻辑都堆在parseCommand里,拆成几个小步骤,维护起来轻松多了:
- 输入预处理:先把用户输入的文本首尾去空格,再按行分割(支持用户一次性输入多行命令)
- 逐行校验&分类:对每一行命令,先用正则匹配,不合法的直接标记错误(比如明确告诉用户「第3行命令格式错误,缺少规则必备的->符号」)
- 分发处理:
- 提取命令前缀(
+或-)和核心内容 - 如果是
+开头,再判断是事实还是规则,分别调用addFact()或addRule() - 如果是
-开头,同理调用removeFact()或removeRule()
- 提取命令前缀(
三、几个实用的细节处理技巧
- 模糊匹配兼容:用户删除规则时可能输入的空格和存储的不一致,比如存的是
+ 猫是哺乳动物 -> 猫是恒温动物,用户删的时候写- 猫是哺乳动物->猫是恒温动物,这时候可以先对两端的内容做标准化处理(比如统一去除所有多余空格)再做匹配 - 友好的错误反馈:别只返回「格式错误」这种干巴巴的话,要具体指出问题,比如「错误:你输入的规则缺少->符号,请按
+ 前提 -> 结论的格式输入」 - 批量处理结果可视化:如果用户一次性输入多行命令,返回结果要清晰列出每行的处理状态,比如:
本次处理结果: - 第1行:成功添加事实「猫是哺乳动物」 - 第2行:格式错误,规则必须包含->符号 - 第3行:成功删除规则「猫是哺乳动物 -> 猫是恒温动物」
内容的提问来源于stack exchange,提问作者BRHSM
相关产品推荐
相关产品推荐

