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。
添加回答
舉報