Java中如何提取表达式所有字段?哪种方法效率最高?
如何提取表达式中的所有字段?哪种方法效率最高?
针对你提出的需求——从数学表达式(如(field_1+field_2)*field_3)中提取所有字段并转为Java列表,同时适配SQL SELECT语句的解析场景,这里给出成熟且高效的解决方案:
优先推荐:使用阿里开源的QLExpress引擎
QLExpress是专门用于表达式解析的工业级库,内置了精准提取变量(即我们要的字段)的能力,比自定义正则更可靠,效率也更高。
1. 引入Maven依赖
首先在你的项目中添加QLExpress的依赖:
<dependency> <groupId>com.alibaba</groupId> <artifactId>QLExpress</artifactId> <version>3.2.0</version> </dependency>
2. 编写提取代码
利用ExpressRunner的getOutVarNames方法,轻松拿到表达式里的所有字段:
import com.ql.util.express.ExpressRunner; import java.util.Arrays; import java.util.List; public class FieldExtractorDemo { public static void main(String[] args) throws Exception { ExpressRunner runner = new ExpressRunner(); // 测试你的示例表达式 String targetExpr = "(field_1+field_2)*field_3"; String[] extractedFields = runner.getOutVarNames(targetExpr); // 转为List类型(按需调整) List<String> fieldList = Arrays.asList(extractedFields); System.out.println(fieldList); // 输出: [field_1, field_2, field_3] } }
为什么这个方法效率最高?
相比自定义正则匹配,QLExpress有两个核心优势:
- 精准性:它通过语法解析而非字符串匹配识别字段,能完美处理嵌套表达式、字段名含特殊字符等复杂场景,不会出现漏提或误提的情况。
- 性能:作为成熟的开源引擎,其解析逻辑经过大量优化,在常规SQL表达式场景下,处理速度远快于手写正则(尤其是批量处理多个表达式时)。
适配SQL SELECT拆分后的场景
针对你提到的已经从SQL中拆分出单个表达式(如(field_1+field_2)*field_3、(field_4-field_5))的情况,只需要循环处理每个表达式,最后合并去重即可:
import com.ql.util.express.ExpressRunner; import java.util.*; public class SqlExprFieldExtractor { public static void main(String[] args) throws Exception { List<String> allExtractedFields = new ArrayList<>(); // 假设这是拆分后得到的表达式列表 List<String> sqlExpressions = Arrays.asList("(field_1+field_2)*field_3", "(field_4-field_5)"); ExpressRunner runner = new ExpressRunner(); for (String expr : sqlExpressions) { String[] fields = runner.getOutVarNames(expr); allExtractedFields.addAll(Arrays.asList(fields)); } // 去重(如果需要避免重复字段) allExtractedFields = new ArrayList<>(new LinkedHashSet<>(allExtractedFields)); System.out.println(allExtractedFields); // 输出: [field_1, field_2, field_3, field_4, field_5] } }
内容的提问来源于stack exchange,提问作者DanielJyc
相关产品推荐
相关产品推荐

