Java中含比较运算符的字符串拆分及运算符提取方案求助
解决方案:拆分带运算符的条件字符串并保留运算符
核心思路
不要用split()拆分运算符(会丢失运算符本身),改用正则捕获组匹配完整的条件结构,一次性提取出「字段路径」「运算符」「目标值」三个关键部分。
具体实现
正则表达式设计
针对你的条件格式,设计带三个捕获组的正则:
^([\w\.]+)(==|!=|~=)(\".*\")$
- 第1组
([\w\.]+):匹配Protobuf嵌套字段路径(允许字母、数字、下划线、点) - 第2组
(==|!=|~=):精准匹配三个目标运算符,保留具体使用的运算符 - 第3组
(\".*\"):匹配带双引号的目标值/正则(如果值包含转义双引号,可调整为(".*?(?<!\\)\"))
Java代码示例
import java.util.regex.Matcher; import java.util.regex.Pattern; public class ConditionProcessor { public static void main(String[] args) { String rawConditions = "fare.details.type!=\"AB\", id.name.first==\"QWERT\""; // 拆分单个条件,自动忽略逗号前后的空格 String[] conditionList = rawConditions.split("\\s*,\\s*"); // 预编译正则,提升性能 Pattern conditionPattern = Pattern.compile("^([\\w\\.]+)(==|!=|~=)(\".*\")$"); for (String condition : conditionList) { Matcher matcher = conditionPattern.matcher(condition); if (matcher.matches()) { // 提取三个关键部分 String fieldPath = matcher.group(1); String operator = matcher.group(2); String targetValue = matcher.group(3).replace("\"", ""); // 可移除引号直接用值 // 根据运算符执行对应比较逻辑 switch (operator) { case "==": // 相等比较逻辑:比如通过反射/Protobuf API获取fieldPath对应的值,再和targetValue比较 System.out.println("执行相等校验:" + fieldPath + " == " + targetValue); break; case "!=": System.out.println("执行不等校验:" + fieldPath + " != " + targetValue); break; case "~=": // 正则匹配逻辑:用targetValue作为正则匹配字段值 System.out.println("执行正则匹配:" + fieldPath + " ~= " + targetValue); break; } } else { System.err.println("无效的条件格式:" + condition); } } } }
额外注意事项
- 如果条件中存在空格(比如
fare.details.type != "AB"),需要调整正则,允许运算符前后的空格,比如把运算符组改成(\\s*==\\s*|\\s*!=\\s*|\\s*~=\\s*) - 若目标值可能是数字/布尔值(而非仅字符串),需要扩展正则的第三组,或者在提取后做类型转换
- 可以把正则和解析逻辑封装成工具类,方便在项目中复用
内容的提问来源于stack exchange,提问作者Achu
相关产品推荐
相关产品推荐

