1 回答
TA贡献1898条经验 获得超8个赞
我想到的第一种方法当然是正则表达式。
但这在未来更新或处理对冲案件可能会很复杂。
相反,您可以尝试使用Nashorn引擎,它允许您在 jvm 中执行 javascript 代码。
所以你只需要创建一个特殊的 javascript 对象来处理你的所有方法:
private static final String jsLib = "var T = {" +
"results: new java.util.HashMap()," +
"methodA: function (p1) {" +
" this.results.put('p1', p1);" +
" return this;" +
"}," +
"methodB: function (p2, p3) {" +
" this.results.put('p2', p2);" +
" this.results.put('p3', p3);" +
" return this;" +
"}," +
"methodC: function (p4) {" +
" this.results.put('p4', p4);" +
" return this.results;" +
"}}";
这是一个简单的字符串,而不是处理您的第一种情况。您可以在 js 文件中编写代码并轻松加载该文件。
您在 javascript 对象中创建了一个特殊属性,即 Java HashMap,因此您可以通过名称获得所有值作为评估结果。
所以你只需评估输入:
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
final String inputSctipt = "T.methodA('p1Value').methodB('p2Value','p3Value').methodC('p4Value')";
try {
engine.eval(jsLib);
Map<String, Object> result = (Map<String, Object>)engine.eval(inputSctipt);
System.out.println("Script result:\n" + result.get("p1"));
} catch (ScriptException e) {
e.printStackTrace();
}
你得到了:
脚本结果:p1Value
以同样的方式,您可以获得所有其他值。
您需要忽略脚本错误,它们是否应该是未实现的路径。
请记住在每次评估之前重置脚本上下文,以避免与以前的值混合。
与正则表达式相比,此解决方案的优点是易于理解,需要时易于更新。
我能看到的唯一缺点当然是 Javascript 的知识和性能。
您没有提到性能问题,因此如果您需要,可以尝试这种方式。
如果您需要比正则表达式更好的性能。
更新
为了获得更完整的答案,这里是使用正则表达式的相同示例:
Pattern p = Pattern.compile("^T\\.methodA\\(['\"]?(.+?)['\"]?\\)\\.methodB\\(['\"]?([^,]+?)['\"]?,['\"]?(.+?)['\"]?\\)\\.methodC\\(['\"]?(.+?)['\"]?\\)$");
Matcher m = p.matcher(inputSctipt);
if (m.find()) {
System.out.println("With regexp:\n" + m.group(1));
}
请注意,此表达式不处理对冲情况,并且您将需要为每个要解析的字符串并获取属性值的 reg exp。
添加回答
举报