Java - 如何处理 $param [重复]

Posted

技术标签:

【中文标题】Java - 如何处理 $param [重复]【英文标题】:Java - How to deal with $param [duplicate]Java - 如何处理 $param [重复] 【发布时间】:2018-12-05 03:51:32 【问题描述】:

客户端传给我一个参数str = "$param0,$param1"。 我想将$param0 $param1 替换为我从数据库中查询的值。

比如

//str = "$param0,$param1"
//str = "$param0,$param1, $param2"
//...
public String format(String str) 

    String param0 = repository.query0();
    //expect
    str = "param0,$param1";

    String param1 = repository.query1();
    //expect
    str = "param0,param1,$param2";

    return str;

我知道java.lang.String#replace可以解决问题。但是参数str 是不确定的。它也可以是str = "$param0, $param1, $param2" 或更多。有什么方法可以满足我的要求吗?

【问题讨论】:

replace + 循环? 你能给我们看一些输入和输出的例子吗! 如何将输入字符串与从数据库查询的值匹配?带索引? @HalayemAnis 同名 所以请清楚地更新您的问题, 【参考方案1】:

如果您确信它将始终采用$paramX 的格式,那么您可以执行以下操作:

String str = ...;
for (int i = 0; i < results.length; i++)

    str = str.replace("$param" + i + "", results[i]);

将 for 循环的内容和 resutls[i] 部分替换为您访问查询返回的数据的方式。

如果您不能依赖 $paramX 是按顺序排列的,则可以使用以下代码来使用更 hacky 的解决方案:

// create a new StringBuilder to reduce concatentation
StringBuilder result = new StringBuilder();

// our warped string input
String str = "$param0, $param12$param1234$param2";

// split it anywhere that is formatted with $paramXXXX
String[] parts = str.split("\\$\\param[0-9]1,\\");

// loop through the pieces
for (int i = 0; i < parts.length; i++)

    // get the parts of the string that are not $paramXXXX
    result.append(parts[i]);

    // the results from the query.
    result.append(queryResults[i]); // Replace with the proper way to read your query results

无论输入如何,只要查询结果的数量与输入字符串中的 $paramXXXX 个片段的数量相同,上述代码都应该工作。

请务必将// Replace with ...后面的代码替换为读取查询结果的代码。

【讨论】:

从数据库中查询替换值。 @Frank.Dai 这没什么变化,答案是正确的。它假设你做了类似String[] results = query.getResultArray(); 如果 $param0,$param10 在这种情况下,只要您有 11 个结果(0 到 10 = 11)就可以正常工作。但是,如果您必须考虑实际上只有两个值并且$paramX 后面的数字实际上是任意的,那么您将需要更多的逻辑来处理它。我现在就写一个:) @MichaelZiluck 我认为真正的问题(但解释得非常糟糕)是 str 就像你的第二个例子。并且OP需要从中读取数字(第一个0),在数据库中查询值(索引0处的值),然后用值替换字符串。对第二个执行相同操作:读取值 12,查询数据库中的 value12,将字符串 $param12 替换为 gueried 值。等等……【参考方案2】:

这是一种使用匹配器的方法:

String str = "$param0,$param1, $param2";
System.out.println("Matching: "+str);
Pattern regex = Pattern.compile("\\$\\(\\w+)\\");
Matcher matcher = regex.matcher(str);
while (matcher.find())
  System.out.println("found: "+matcher.group());
  str = matcher.replaceFirst("results");
  matcher = regex.matcher(str);

System.out.println("Result: "+str);

这不是很有效,但很容易使用。如果您有千兆字节规模的计算,请考虑循环输入字符串并手动比较字符。

更新:

这是一个更好的方法。如果结果包含该模式,则效率更高且不易出现死循环。

String str = "[$param0,$param1, $param2]";
System.out.println("Matching: " + str);
final Pattern regex = Pattern.compile("\\$\\(\\w+)\\"); 
final Matcher matcher = regex.matcher(str);
final StringBuilder sb = new StringBuilder(str.length());
int prevMatch = 0;
while (matcher.find()) 
  System.out.println("found: " + matcher.group());
  sb.append(str.substring(prevMatch, matcher.start()));
  sb.append("results");
  prevMatch = matcher.end();

sb.append(str.substring(prevMatch, str.length()));
System.out.println("Result: " + sb.toString());

【讨论】:

@Socowi 谢谢,反正我不喜欢这个匹配器重建,所以我完全改变了它。

以上是关于Java - 如何处理 $param [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何处理java.lang.ArrayIndexOutOfBoundsException:java中的0 [重复]

Java:如何处理两个进程试图修改同一个文件[重复]

机器学习模型如何获得可重复的结果?最佳实践是什么?如何处理random_state参数?

如何处理 promise 的错误?

如何处理重复条目的错误?

如何处理重复事件中的 DST 和 TZ?