Java 如何解析具有函数和参数的字符串,字符串定义在定义良好的;";

Java 如何解析具有函数和参数的字符串,字符串定义在定义良好的;";,java,Java,我的绳子是 String s="(decode(W_Employee_D_3.Fst_Name,NULL," + "decode(W_Employee_D_3.Last_Name,NULL," + "decode(W_Employee_D_3.Mid_Name,NULL,'emptyString','midnamevailable'),'lastnameavil')," + "concat(CONCAT ( concat(W_Employee_D_

我的绳子是

String s="(decode(W_Employee_D_3.Fst_Name,NULL,"
        + "decode(W_Employee_D_3.Last_Name,NULL,"
        + "decode(W_Employee_D_3.Mid_Name,NULL,'emptyString','midnamevailable'),'lastnameavil'),"
        + "concat(CONCAT ( concat(W_Employee_D_3.last_Name, ' ,'),"
        + "W_Employee_D_3.Fst_Name ),W_Employee_D_3.Mid_Name)))";
我需要编写一些通用逻辑,在Java中的任何类型的集合中给出fun1=decode,fun2=decode,fun3=decode,fun4=concat,fun5=concat,fun6=concat及其各自的参数1,para2,para3。 参数是在函数中传递的参数, 例如 concat(W_员工D_3.姓氏,,) concat是函数,参数是W_Employee_D_3.last_Name&'


字符串可以包含任意数量的函数、参数,也可以有不同的函数。

这看起来像是一种普通的任务。也许你必须使用一些ANTLR语法? 我将提供一种方法来完成工作中不那么乏味的部分

对于这样的筑巢,人们会

  • 使用堆栈从左到右解析,或
  • 使用可还原表达式,从最内部的重定义开始,并构建一些结果
我使用后者,用一个映射来保存结果结构,并在字符串中替换为一些“变量”

我们可以引入变量

  • 字符串文字,可能包含逗号、括号和其他不需要解析的文本
  • 函数调用
如果给出简化情况的解决方案:

String s = "a(b(c),d(e),f,g(h(),i)";

// Variables are like "§0013" (4 digits)
Map<String, String> variables;
int maxVar = 0;

String expr = "(\\w+|§\\d{4})"; // Either simple term or var name.
Pattern callRedex = Pattern.compile("\\w+\\((" + expr + "(," + expr + ")*)?\\)");
boolean reduced;
do {
    reduced = false;
    Matcher m = callRedex.matcher(s);
    StringBuffer sb = new StringBuffer();
    while (m.find()) {
        String value = m.group();
        String var = String.format("§%04d", maxVar++);
        variables.put(var, value);
        m.appendReplacement(sb, var);
        reduced = true;
    }
    m.appendTail(sb);
    s = sb.toString();
} while (reduced);
String s=“a(b(c),d(e),f,g(h(),i)”;
//变量类似于“§0013”(4位数字)
映射变量;
int-maxVar=0;
String expr=“(\\w+|§\\d{4})”;//简单术语或变量名称。
Pattern callRedex=Pattern.compile(\\w+\\(“+expr+”(,“+expr+”*)?\\);
布尔约化;
做{
减少=错误;
Matcher m=callRedex.Matcher;
StringBuffer sb=新的StringBuffer();
while(m.find()){
字符串值=m.group();
String var=String.format(§%04d),maxVar++);
变量。put(var,value);
m、 (sb,var);
减少=真实;
}
m、 (某人);
s=sb.toString();
}而(减少),;

现在有一个函数调用作为变量。它们的值包含变量名,并且必须再次替换。

什么是
fun1,fun2,fun3
parameter1,para2,para3
?一些数据?到目前为止您尝试了什么?乐趣的所有可能值是什么?它们只是解码或浓缩还是可能有其他值?请检查ck编辑的部分。在这个字符串decode和Concat中是有趣的值。在其他情况下,它可以是任何类型的oracle Sql函数。我想解决这个函数层次结构。如果它是直接函数,那么我可以轻松阅读,但如果它是子函数(函数内部的函数)我无法阅读。谢谢Joop,我将尝试使用ANTLR语法来解析。