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

在 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 1

b.T.methodM().methodL(p10) // No Match

c.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。


DIEA
浏览 157回答 1
1回答

汪汪一只猫

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

相关分类

Java