是否有简单的正则表达式将 Java 字符串列表转换为 Oracle IN 条件



例如:

有一个字符串列表(ArrayList shopList,并输出到 String() 像这样

[bread, sugar, butter]

现在我需要将此列表转换为 Oracle IN 条件,以便它变为:

('bread', 'sugar', 'butter')

我使用

String shopListString= "(".concat(shopList.toString().replaceAll("[\s\[\]]", "'")).concat(")");

首先,我尽量避免 concat 但单独使用正则表达式,它也只是输出以下错误:

('bread,'sugar,'butter')

只有最后一项带有开头'

下面是

一个Java 8示例:

// example list
List<String> myList = new ArrayList<String>(){
    {add("bread");add("sugar");add("butter");}
};
// result
// initializing StringBuilder with starting "("
String oracle = myList
    .stream()
    // collecting as "," separated CharSequence, enclosed in "(" and ")"
   .collect(Collectors.joining("','", "('", "')"));
System.out.println(oracle);

输出

('bread','sugar','butter')

笔记

  • 这里的想法是使用(隐藏)迭代,而不是解析和转换ListString表示。
  • 在比Java 8更早的Java习语中,这需要更多的代码,以及一些"命令式"式的丑陋(参见Casimir et Hippolyte的有效答案)。
  • 感谢吉皮尔提供大大改进的解决方案。
  • 正如安德烈亚斯所提到的,要小心未经净化的价值观。您可能希望构建一个格式String,其中包含与List元素一样多的占位符,然后改用PreparedStatement

一个简单的方法基于@Keppil:

"('"+ StringUtils.join(myList, "','") + "')"

这是原点答案使用group变量替换:

"("+ StringUtils.join(myList, ",").replaceAll("(\w+)", "'$1'") + ")"

您可以使用StringUtils join字符串和环绕group变量来替换单词。

遍历arrayList元素并使用stringBuilder。

StringBuilder sb = new StringBuilder("('");
int lastIndex = myList.size() - 1;
for (int i=0; i < lastIndex; i++) {
    sb.append(myList.get(i));
    sb.append("','");
}
sb.append(myList.get(lastIndex));
sb.append("')");

注意:我假设 arrayList 不为空。

    StringBuffer sb = new StringBuffer("(");
    //assume this list is populated
    List<String> str = new ArrayList<String>();
    for (int i =0;i<str.size();i++) {
         String temp = "'" + str.get(i) + "'";
         sb.append(temp);
         if(i != (str.size() -1)) {
             sb.append(",");
         }
    }
    sb.append(")");
    System.out.println(sb.toString());

最新更新