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);
Остальное вы можете изменить тело функции, подпись и оператор возврата в соответствии с вашими потребностями.