MVEL从字符串中提取字符串

时间:2015-02-05 21:52:02

标签: mvel

我有字符串" 000134567 - AA - 2001"和" 002134567 - AB - 2001"我想在"之前提取所有数字。 - AA"。但我只想从第一个非零数字开始返回数字。例如,我想要" 134567"或" 2134567"。

是否有一些功能允许我使用MVEL执行此操作?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

我不认为我们可以直接使用MVEL,但是调整一下可能对我们有所帮助。

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

import org.mvel2.MVEL;
import org.mvel2.ParserContext;
import org.mvel2.integration.VariableResolverFactory;
import org.mvel2.integration.impl.MapVariableResolverFactory;

public class MyTest {
    public static void main(String[] args) {
        String myString = "000134567 - AA - 2001";

        Map contextMap = new HashMap();
        contextMap.put("myString", myString);

        ParserContext ctx = new ParserContext();
        ctx.addPackageImport("java.util.regex");

        Serializable s = MVEL.compileExpression("outputString(myString)", ctx);

        System.out.println(MVEL.executeExpression(s, contextMap, getMvelFactory(contextMap)));
    }

    private static VariableResolverFactory getMvelFactory(Map contextMap) {
        VariableResolverFactory functionFactory = new MapVariableResolverFactory(contextMap);
        MVEL.eval(
                "outputString = def (myString) { java.util.regex.Pattern p = java.util.regex.Pattern.compile(\"[0-9]+\"); java.util.regex.Matcher m = p.matcher(myString); if (m.find()) { String output = m.group(); return output.replaceAll(\"^0+\", \"\");}};",
                functionFactory);
        return functionFactory;
    }
}

<强>功能

下面是我用java编写的函数,我已将其包含在Mvel VariableResolverFactory中。

outputString = def (myString) { 
        java.util.regex.Pattern p = java.util.regex.Pattern.compile("[0-9]+");
        Matcher m = p.matcher(myString);
        if (m.find()) {
            String output = m.group();
            return output.replaceAll("^0+", "");
        }
 };

创建解析器上下文并添加导入

由于java.util.regex包不适用MVEL,因此我们会明确导入此包。

    ParserContext ctx = new ParserContext();
    ctx.addPackageImport("java.util.regex");

使用上面的导入

编译表达式

这将只编译表达式并添加导入以供以后评估时使用。

Serializable s = MVEL.compileExpression("outputString(myString)", ctx);

变量变量

您可以按如下方式传递变量,

    Map contextMap = new HashMap();
    contextMap.put("myString", myString);

您可以根据需要更改功能正文,签名和返回声明。