【问题标题】:Replacing substring inside string not working? Java XML替换字符串中的子字符串不起作用? Java XML
【发布时间】:2013-10-20 14:52:57
【问题描述】:

全部,

我将 SQL 查询存储为我的 java 应用程序的 XML 以提高可维护性。

我的部分查询需要参数化,因此我创建了标识符,可以在创建查询字符串时用值替换。

例如

WHERE CB.callback_date >= TO_DATE('$LASTDATE$','DD/MM/YYYY')
  AND CB.callback_date < TO_DATE('$FROMDATE$','DD/MM/YYYY')

我的应用程序中有一个函数可以替换这些子字符串。

public static String xmlQueryPrep(String prep)
{

    //add dates to query
    prep.replace("'$LASTDATE$'", "'20/10/2013'");
    prep.replace("'$FROMDATE$'", "'18/10/2013'");
    prep.replace("&lt;", "<").replace("&gt;", ">");
    return prep;    
}

由于某种原因,它正在替换 的 ASCII 代码,但它没有替换我的标记

输出

WHERE CB.callback_date >= TO_DATE('$LASTDATE$','DD/MM/YYYY')
  AND CB.callback_date < TO_DATE('$FROMDATE$','DD/MM/YYYY')

为什么不能正确替换?

【问题讨论】:

  • 看起来您正在使用字符串操作来构建 SQL。你知道这个想法有多糟糕吗?如果您可以使用参数化的准备查询或(正确设计的)命名查询,您将避免很多麻烦! (请注意,这是真的独立于您使用什么语言来准备查询。)

标签: java regex replace


【解决方案1】:

Strings 在 Java 中是 immutables

一个对象被认为是不可变的,如果它的状态在它之后不能改变 被构造了

如果你看一下documentation,你会发现每一个应用于字符串以修改其内容的方法都会返回一个新的字符串。

你应该这样做:

prep = prep.replace("'$LASTDATE$'", "'20/10/2013'");
prep = prep.replace("'$FROMDATE$'", "'18/10/2013'");
prep = prep.replace("&lt;", "<").replace("&gt;", ">");
return prep;  

甚至更好 (method chaining):

return prep.replace("'$LASTDATE$'", "'20/10/2013'")
           .replace("'$FROMDATE$'", "'18/10/2013'")
           .replace("&lt;", "<")
           .replace("&gt;", ">");

【讨论】:

  • 换句话说,string.replace(.....) 返回一个 新字符串,其中发生了替换操作,旧字符串不受影响
  • 为什么 C++ 与字符串不同?
  • Java 基于 C/C++,但它是一种新的/不同的语言。有许多不同之处 - 因此只是其中之一。
  • @serupticious Java 的 StringBuilder 工作起来更像 C 和 C++ 中的字符串,但它(直接)使用的频率要低得多。
猜你喜欢
  • 2015-06-24
  • 2023-03-25
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-09
  • 2011-09-07
相关资源
最近更新 更多