Java中如何解析表达式字符串,替换字段并将日期转为datetime值?
解决方案
你可以通过带捕获组的正则表达式一次性完成字段替换和日期格式转换,无需单独提取日期值再处理,效率更高。以下分两种Java版本给出实现:
Java 9+ 版本(支持Lambda替换)
利用replaceAll的Lambda重载,直接在匹配逻辑中完成字段替换和日期拼接:
final String expression = "id = 123 AND openDate < 2023-01-01 AND closeDate = 2024-01-01"; final String newExpression = expression.replaceAll( "\\b(openDate|closeDate)\\s*([<>=]+)\\s*(\\d{4}-\\d{2}-\\d{2})", matcher -> { // 替换旧字段为新字段 String newField = matcher.group(1).equals("openDate") ? "openDateTime" : "closeDateTime"; // 获取操作符和原始日期 String operator = matcher.group(2); String date = matcher.group(3); // 拼接成目标格式 return String.format("%s %s %s 00:00", newField, operator, date); } );
Java 8 及以下版本
通过两次独立的正则替换完成,用$n引用捕获组内容:
final String expression = "id = 123 AND openDate < 2023-01-01 AND closeDate = 2024-01-01"; final String newExpression = expression .replaceAll("\\bopenDate\\s*([<>=]+)\\s*(\\d{4}-\\d{2}-\\d{2})", "openDateTime $1 $2 00:00") .replaceAll("\\bcloseDate\\s*([<>=]+)\\s*(\\d{4}-\\d{2}-\\d{2})", "closeDateTime $1 $2 00:00");
正则逻辑说明
\\b:匹配单词边界,确保只替换独立的openDate/closeDate字段,避免误匹配类似xxxopenDate的字符串\\s*:匹配操作符前后的任意空白字符(兼容表达式中可能的空格差异)([<>=]+):捕获比较操作符(支持</>/=/>=/<=等)(\\d{4}-\\d{2}-\\d{2}):捕获yyyy-MM-dd格式的日期字符串
处理后最终得到的表达式为:
id = 123 AND openDateTime < 2023-01-01 00:00 AND closeDateTime = 2024-01-01 00:00
内容的提问来源于stack exchange,提问作者j3d
相关产品推荐
相关产品推荐

