Java replaceAll 将除首尾位置外的所有单引号替换为两个单引号

3
我想用两个引号替换除了第一个和最后一个出现的所有单引号,我已经使用以下正则表达式排除了最后一个出现的情况。
String toReplace = "'123'456'";
String regex = "'(?=.*')";
String replaced = toReplace.replaceAll(regex,"''");
System.out.println(replaced);

这里我得到了

''123''456'

我该如何获取

'123''456'

谢谢。

也许你可以用两个单引号替换所有的单引号,然后再删除第一个和最后一个单引号? - Ahmet Amasyalı
如果你已经排除了最后一个字符,那么replaced.substring(0,1)删除第一个字符怎么样? - Cyrille Con Morales
@kayaman 是的,我正在转义为 SQL 的字符串 - Meesh
2
@Meesh 如果你还在手动转义值,或者使用正则表达式来完成这个任务,那么请停下来。使用 PreparedStatement.setString() 方法可以自动转义所有必要的内容,而且你也不需要在开头和结尾加上 ' 符号了。 - Kayaman
@kayaman,谢谢你的建议,我会继续走这条路。 - Meesh
显示剩余2条评论
4个回答

3
int first = toReplace.indexOf("'") + 1;
int last = toReplace.lastIndexOf("'");

String afterReplace = toReplace.substring(0, first)
        + toReplace.substring( first,last ).replaceAll("'", "''")
        + toReplace.substring(last);

System.out.println(afterReplace);

使用StringBuilder
String afterReplace = new StringBuilder()
        .append(toReplace, 0, first)
        .append(toReplace.substring(first, last).replaceAll("'", "''"))
        .append(toReplace, last, toReplace.length())
        .toString();

或者使用 String.format

String afterReplace = String.format("%s%s%s",
        toReplace.substring(0, first),
        toReplace.substring(first, last).replaceAll("'", "''"),
        toReplace.substring(last));

避免使用字符串拼接,改用 StringBuilder.add。这是一个好的解决方案。 - Evgeni Enchev
对于这个问题,我认为使用字符串拼接没有任何问题,在这里使用StringBuilder可能是一种过早的优化。 - Ruelos Joel
没错,@RuelosJoel,也许我太讨厌字符串拼接了。 - Evgeni Enchev

3

有一个简洁的说法关于正则表达式和两个问题,但我会跳过它,建议您使用StringBuilder来简化此操作;在输入中找到第一个'和最后一个'的索引,然后在这些索引之间迭代查找'(并用''替换)。类似以下代码:

StringBuilder sb = new StringBuilder(toReplace);
int first = toReplace.indexOf("'"), last = toReplace.lastIndexOf("'");
if (first != last) {
    for (int i = first + 1; i < last; i++) {
        if (sb.charAt(i) == '\'') {
            sb.insert(i, '\'');
            i++;
        }
    }
}
toReplace = sb.toString();

0

正则表达式:(?<=')(. *)(?=')

它将帮助您找到结果,然后您可以替换它。


0

这也可以用正则表达式实现:

      // String to be scanned to find the pattern.
      String line = "'123'456'";
      String pattern = "(?>^')(.*)(?>'$)";

      // Create a Pattern object
      Pattern r = Pattern.compile(pattern);

      // Now create matcher object.
      Matcher m = r.matcher(line);
      if (m.find( )) {
         System.out.println("Found value: " + m.group(1) );
         String replaced = m.group(1).replaceAll("'","\"");
         System.out.println("replaced value: " + replaced );
      }else {
         System.out.println("NO MATCH");
      }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接