-2

我们如何在 Java 中替换现有字符串中的特定字符串?

例子:

String param = "aa,bb,cc";
String str = 
  "select column_val from table_name where a = '?' and b = '?' and c = '?'";

现在我想用它的位置替换参数,比如..

String newStr = 
  "select column_val from table_name where a = 'aa' and b = 'bb' and c = 'cc'";

我们应该怎么做?stringutil 中是否有任何现有方法,或者是否有任何方法可以做到这一点?

4

4 回答 4

6

处理此问题的正确方法是使用 PreparedStatement. 它不仅会替你做替换,还会保护你免受SQL 注入攻击

是的,我只是在这里演示选择查询,但它不是选择查询,它是简单的字符串

在这种情况下,有一种简单的方法可以做到:

 String param = "aa,bb,cc";
 String str = "select column_val from table_name where a = '?' and b = '?' and c = '?'";
 String fmt = str.replaceAll("[?]", "%s");
 String newStr = String.format(fmt, (Object[])param.split(","));

确保您输入的模式没有任何杂散的问号或百分比字符。

于 2012-05-30T07:31:56.700 回答
0

String.format听起来像你应该使用的;它基本上就像 C 的sprintf。详细信息可以在Formatterjavadoc 中找到。

于 2012-05-30T07:30:31.897 回答
0
    String param = "aa,bb,cc";
    String str = 
      "select column_val from table_name where a = # and b = # and c = #";
    String [] arr = param.split(",");
    for(int i=0; i<arr.length; i++){str.indexOf("#");
        str = str.replaceFirst("#", "'"+arr[i]+"'");
    }
    System.out.println(str);
于 2012-05-30T07:44:25.580 回答
0

我建议你使用 StringBuilder。它们为您的字符串操作类型提供了一些性能提升,尤其是当您的 sql 或参数是长字符串时。

这是一个例子:

String param = "aa,bb,cc";
String str = 
     "select column_val from table_name where a = '?' and b = '?' and c = '?'";

@Test
public void Substitute(){
    StringBuilder builder=new StringBuilder(str);

    String[] params = param.split(",");
    int position=0;
    for (String paramValue:params){
        position=builder.indexOf("?",position);
        if (position==-1)
            throw new RuntimeException("too parameter values specified.");
        builder.replace(position,position+1,paramValue);
        position++;
    }
    position=str.indexOf("?",position);
    if (position!=-1)
        throw new RuntimeException("Not all parameter specified.");

    Assert.assertEquals(builder.toString(),
          "select column_val from table_name where a = 'aa' and b = 'bb' and c = 'cc'");

}

正如其他人所说,请记住清理参数值以避免安全问题......

于 2012-05-30T07:57:15.757 回答