MVEL извлекает строку из строки

У меня есть строки "000134567 - AA - 2001" и "002134567 - AB - 2001", и я хочу извлечь все числа перед "- AA". Но я хочу только вернуть числа, начиная с первого ненулевого числа. Например, я хотел бы "134567" или "2134567".

Есть ли какая-нибудь функция, которая позволила бы мне сделать это с помощью MVEL? Любая помощь приветствуется.

1 ответ

Решение

Я не думаю, что мы можем напрямую использовать 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);

Остальное вы можете изменить тело функции, подпись и оператор возврата в соответствии с вашими потребностями.

Другие вопросы по тегам