Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java如何替换?带值的字符串_Java - Fatal编程技术网

java如何替换?带值的字符串

java如何替换?带值的字符串,java,Java,从理论上讲,这件事很简单,但我找不到答案 假设我们有字符串: "Today at ? cars yellow: ? cars red: ? cars black ?" 现在我想创建一个函数来执行X,方法如下: X("Today at ? cars yellow: ? cars red: ? cars black", value1, value 2, value 3, value 4) 要获取字符串的结果,请执行以下操作: "Today at 12:00 cars yellow: 123 ca

从理论上讲,这件事很简单,但我找不到答案

假设我们有字符串:

"Today at ? cars yellow: ? cars red: ? cars black ?"
现在我想创建一个函数来执行
X
,方法如下:

X("Today at ? cars yellow: ? cars red: ? cars black", value1, value 2, value 3, value 4)
要获取字符串的结果,请执行以下操作:

"Today at 12:00 cars yellow: 123 cars red: 11 cars black 24"

是否有现成的
X
功能可供使用?如果不是,如何编写我自己的?

即使占位符不是,您最终也可以使用MessageFormat?但是{x}用x表示变量在输入列表中的位置:

检查String.format()文档:

我认为java中不存在这样的方法。但其中一个实现可能是这样的(尽管它是特定于toooo问题的)


您可以轻松制作一个:

static String X(String sentence, String... args) {
   for (String arg : args) {
        sentence = sentence.replaceFirst("\\?", arg);
    }
    return sentence;
}

如果您能够修改字符串的外观并使用
%s
而不是
您可以改用。

这应该可以正常工作,请查看String.format()方法。将“”的每个实例替换为“%s”,然后调用String.format并传递所有参数

while(myString.contains("?")){
  myString = myString.subString(0,myString.indexOf("?")) + "%s" + myString.subString(myString.indexOf("?" + 1));
}
String final = String.format(myString, val1, val2, val3);

下面的解决方案受Kevin DiTraglia的启发,我认为是完美的(可以将不同的对象和基本类型作为参数,而不仅仅是字符串)


如果您切换到使用
%d
(和/或
%s
)而不是
,那么您可以使用可能会有所帮助?您是否必须使用
,或者它可能是其他东西?或者,如果您有一个参数数组,它会更好。因为
String.format
使用
{0}
?我以为是
%[argument_index$][flags][width][.precision]转换
。也许你的意思是
MessageFormat.format
如中所示。如果我可以很容易地将其称为X(string,long,long,string),那将是一个完美的解决方案。否则,我必须先手动将参数转换为字符串。但是还是很感谢你。如果我的字符串已经包含%用于其他目的呢?这是一个很好的观点。您必须首先清理字符串,您可以将%转换为其他格式,然后在格式之后再转换回%。但是你需要一个不被使用的特殊符号。字符串s=“测试?%”s=s.replace(“%”,“@”);s=s。替换(“?”,“%s”);s=String.format(s,arg,arg,arg);s=s。替换(“@”和“%”);更好的版本,处理输入中的%出现次数。
static String x(final String format, final Object... values) {

    String f = format.replace("%", "%%");

    f = f.replace("?", "%s");

    return String.format(f, values);
}
while(myString.contains("?")){
  myString = myString.subString(0,myString.indexOf("?")) + "%s" + myString.subString(myString.indexOf("?" + 1));
}
String final = String.format(myString, val1, val2, val3);
/** replaces ? with arguments */
public static String format (String text, Object... args) {
       for (Object arg : args) {
            text = text.replaceFirst(SPECIAL_CHAR, arg.toString());
        }
    return text;
}