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 语句。
我有字符串“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 语句。