MVEL 从字符串中提取字符串

MVEL extracting a string from a string

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

是否有一些功能可以让我使用 MVEL 执行此操作?感谢您的帮助。

我认为我们不能直接为此使用 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);

其余的,您可以根据需要更改函数体、签名和 return 语句。