-1

这是我在此的头一篇博文。很抱歉,如果我做错了。

我的任务是从字符串公式中获取变量列表,例如“A + B * (C - 21.2) / DD”。我在 Apache Jexl lib 中找到了解决方案。这正是我所需要的。

JexlEngine engine = new JexlEngine();
Set<List<String>> exactlyWhatINeed = engine.createScript("A+B+C/D").getVariables()

这为我提供了已解析变量的列表,非常完美。

但我有一个大麻烦。我的变量可以用俄语编写。所以公式可以像“23 - О + ПАНЬКИ * simpleANSI_Var”。这个库抛出一个异常,因为变量名必须在 ANSI 32 到 127 之间。

我需要类似的东西,花了两天时间进行谷歌搜索和测试。我好累,如果有人知道解决方案,请帮助我。我只需要一个 var 的列表,我知道如何执行它并通过脚本引擎或其他库(如 JEval)获得结果。

提前谢谢各位朋友。是的。对不起我的英语很差。

4

1 回答 1

0

扩展我的评论,这是我设想的那种解决方案:

class HaxlEngine
{
    static boolean isANSI(final char c)
    {
        return c <= 0x7F;
    }

    public static Set<List<String>> doSum(String formula)
    {
        JexlEngine engine = new JexlEngine();
        final Map<Character, Character> mappedChars = new HashMap<>();
        char ansiCounter = 'A';
        for(final char c : formula.toCharArray())
        {
            if(!isANSI(c))
            {
                char newValue;
                do
                {
                    newValue = ansiCounter++;
                }
                while(formula.contains(String.valueOf(newValue)));
                mappedChars.put(c, newValue);
                formula = formula.replace(c, newValue);
            }
        }
        final Set<List<String>> exactlyWhatINeed = engine.createScript(formula).getVariables();
        for(final List<String> list : exactlyWhatINeed)
        {
            for(String str : list)
            {
                for(final Map.Entry<Character, Character> entry : mappedChars.entrySet())
                {
                    str = str.replace(entry.getValue(), entry.getKey());
                }
            }
        }
        return exactlyWhatINeed;
    }                                                       
}

这将检查您给它的公式中的每个字符,并将任何不是有效 ANSI 字符的字符替换为标准ABC等。我无法测试实际的引擎部件,但是替换似乎在我的测试中有效(见下文),所以我相信当您插入库时它会起作用。

static boolean isANSI(final char c)
{
    return c <= 0x7F;
}


static String testReplaceNonANSI(String maybeANSI)
{
    final Map<Character, Character> mappedChars = new HashMap<>();
    char ansiCounter = 'A';
    for(final char c : maybeANSI.toCharArray())
    {
        if(!isANSI(c))
        {
            char newValue;
            do
            {
                newValue = ansiCounter++;
            }
            while(maybeANSI.contains(String.valueOf(newValue)));
            mappedChars.put(c, newValue);
            maybeANSI = maybeANSI.replace(c, newValue);
        }
    }
    return maybeANSI;
}

public static void main(String[] args)
{
    String a = "(A+B/C) * X";
    String b = "(О+А/C) * П";
    System.out.println(testReplaceNonANSI(a)); //(A+B/C) * X
    System.out.println(testReplaceNonANSI(b)); //(A+B/C) * C
}
于 2013-08-22T18:27:21.293 回答