替换字符串中特定索引的字符串?

时间:2012-05-30 07:29:13

标签: java

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

示例:

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

现在我想用它的位置替换params ...

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

我们怎么做? stringutil中是否存在任何现有方法,或者有任何方法可以执行此操作吗?

4 个答案:

答案 0 :(得分:6)

处理此问题的正确方法是using PreparedStatement。它不仅可以代替您,还可以防范SQL injection attacks

  

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

在这种情况下,有一种简单的方法:

 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(","));

确保您输入的图案没有任何杂散问号或百分号。

答案 1 :(得分:0)

String.format听起来像你应该使用的;它基本上就像C sprintf。详情可在Formatter javadoc。

中找到

答案 2 :(得分: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);

答案 3 :(得分:0)

我建议你使用StringBuilder。它们在您的字符串操作类型中提供了一些性能提升,特别是如果您的sql或params是长字符串。

以下是一个例子:

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'");

}

正如其他人所说,记得清理param值以避免安全问题......