亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

匹配列表中的字符串并提取值

匹配列表中的字符串并提取值

DIEA 2021-07-19 16:15:56
在 Java 中實現以下目標的最有效(低 CPU 時間)方法是什么?假設我們有一個字符串列表,如下所示:1.T.methodA(p1).methodB(p2,p3).methodC(p4)2.T.methodX.methodY(p5,p6).methodZ()3 ...在運行時,我們得到如下字符串,這些字符串可能與列表中的字符串之一匹配:a.T.methodA(p1Value).methodB(p2Value,p3Value).methodC(p4Value) // Matches 1b.T.methodM().methodL(p10) // No Matchc.T.methodX.methodY(p5Value,p6Value).methodZ() // Matches 2我想將 (a) 匹配到 (1) 并提取 p1、p2、p3 和 p4 的值,其中:p1Value = p1, p2Value = p2, p3Value = p3 and so on.類似的其他匹配,例如 c 到 2。
查看完整描述

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。


查看完整回答
反對 回復 2021-07-29
  • 1 回答
  • 0 關注
  • 175 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號