当前位置: 首页 > 知识库问答 >
问题:

Java替换没有引号的问号

阎自怡
2023-03-14

我正在用不同的值替换字符串中的问号。

例子:

String: "XYZ(?,?,?)"

Values: [1, 'Text', 0.5]

Result: XYZ(1,'Text', 0.5)

我的Preudo代码:

String s = "XYZ(?,?,?)";
for(int i = 0; i < array.lengh; i++){
   s = s.replaceFirst("\\?",array[i]);
}

通常这工作得很好。但有时我在值中有一个问号,例如:Value:[1,'问题?',0.5]。然后我的结果是:XYZ(1,'问题0.5', ?) 。这是因为该函数替换了之前一次迭代替换的文本的问号。

如何告诉函数只替换没有引号包围的问号?正确的正则表达式是什么?

共有3个答案

乔丁雨
2023-03-14

下面是一种更直接的方法,怎么样?

public class Replacer {
    static String replace(String s, String[] values) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0, j = 0; i < s.length(); i ++) {
            char c = s.charAt(i);
            if (c != '?')
                sb.append(c);
            else
                sb.append(values[j++]);
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        System.out.println(replace("XYZ(?, ?, ?)", new String[]{"1", "Question?", "0.5"}));
        System.out.println(replace("XYZ(?, ?, ?)", new String[]{"foo", "bar", "baz"}));
    }
}

此打印:

XYZ(1, Question?, 0.5)
XYZ(foo, bar, baz)
姜志行
2023-03-14

您可以先用%s替换所有问号,然后使用字符串。格式(输入,参数…) 。类似这样:

Object[] array = {1, "Test", 0.5};
String s = "XYZ(?,?,?)";

String output = String.format(s.replace("?", "%s"), array);
System.out.println(output);

会给你这个输出:

XYZ(1,测试,0.5)

另外,请注意,在您的问题中,您的s.replaceFirst(“\\?”,阵列[i] 调用是无效的,因为在Java中字符串是不可变的,对字符串的所有操作(如replace)都返回一个新字符串,您应该使用返回的字符串。

另一个注意事项:字符串应该是双引号,而不是单引号。

胡玉书
2023-03-14

如果你不必使用正则表达式或替换,这个怎么样?

String s = "XYZ(?,?,?)";
String[] tokens = s.split("\\?");
s = "";
for(int i = 0; i < array.length; i++){
   s += tokens[i] + array[i];
}
s += tokens[array.length];

(编辑:escape?在正则表达式中,长度有一个t,最后一次插入后需要部分)

如果可以有额外的问号,即多于要插入的值的数量,并且您希望像OP代码一样保留额外的问号和它们之后的任何文本,请限制拆分

String[] tokens = s.split("\\?", array.length+1);

如果问号的数量或结果的总大小(模板字符串加上插入)很大,则重复字符串连接的性能很差;改用StringBuilder:

StringBuilder b = new StringBuilder (s.length()+estimated_expansion);
// this estimate doesn't have to be correct, but if it is high enough 
// without being *much* too high performance is optimized
for(int i = 0; i < array.length; i++ ){
  b.append(tokens[i]).append(array[i]);
}
s = b.append(tokens[array.length]).toString();
 类似资料:
  • 本文向大家介绍js 单引号替换成双引号,双引号替换成单引号的实现方法,包括了js 单引号替换成双引号,双引号替换成单引号的实现方法的使用技巧和注意事项,需要的朋友参考一下 1.双引号替换成单引号 2.单引号替换成双引号 以上这篇js 单引号替换成双引号,双引号替换成单引号的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 问题内容: 我似乎有问题。我有一个查询字符串,其值可以包含单引号。这将中断查询字符串。因此,我试图进行替换以更改为。 这是一个示例代码: 输出仍然是: 它认为我只是对引号进行转义。 所以我尝试了这两段代码: 上面的两个STILL结果都相同: 我似乎只能得到这实际上吐出一个斜线: 结果是: 有什么建议?我只是想更换一个同。 似乎应该没有那么困难。 问题答案: 首先,如果您要对查询字符串编码撇号,则需

  • 问题内容: 如何使用PHP 用(我认为其称为单引号)替换(我认为它称为双引号)? 问题答案: 或重新分配

  • 问题内容: 我正在从数据库中检索数据,其中该字段包含带有HTML数据的字符串。我想替换所有的双引号,使得它可以被用于的 jQuery的 。 使用Java,我正在尝试使用替换引号。 结果字符串未显示所需的更改。O’Reilly的一篇文章规定了使用Apache字符串工具。还有其他办法吗? 是否有正则表达式或我可以使用的东西? 问题答案: 这是如何做 请注意,字符串是不可变的,因此仅仅做是不够的。您必须

  • 以下是降价文本的示例: #“我的标题” !图像标题。{ 样式=“浮动:右; 宽度: 20%; 边框: 1px”} 有的“引用文字”,有的*“强调文字”*等。 在bash脚本中,我试图用法语引号替换任何双引号。 例如:“word”应变成« 换句话说,一个单词前的所有引号都应该替换为一个开放的法语引号,后跟一个不间断的空格;而且一个单词后面的所有引号都要换成一个不换行的空格后面跟着一个闭合的法语引号;

  • 问题内容: 这让我发疯了,所以请您帮忙… 我有一个Java字符串,我想用单引号替换所有反斜杠双引号序列,即使我逃避了我认为必要的替换命令,该命令也不会对字符串产生任何影响。 感谢任何建议。 谢谢。 问题答案: 在Java中,字符串是不可变的。您对字符串执行的任何操作都会产生新的对象。操作后,您需要重新分配值。以下内容可能会对您有所帮助。