String newDate = date.replace(date.subString(date.indexOf("-")+1,date.lastIndexOf("-")),"October");
让我们打开它。你是含蓄的
int firstHyphen = date.indexOf("-");
int lastHyphen = date.lastIndexOf("-");
但是对于给定的字符串,这和说的一样
int firstHyphen = 2;
int lastHyphen = 5;
接下来,你有一个隐式变量的创建
String month = date.subString(firstHyphen+1, lastHyphen);
与
相同
String month = date.subString(3, 5);
但是什么子字符串从 3 开始并在 5 之前结束?
String month = "10";
所以我们可以将您的原始代码替换为
String newDate = date.replace("10", "October");
现在应该很清楚,您不仅限于连字符之间的字符串部分。该限制仅适用于子字符串。在替换中使用子字符串的结果后,您只需将其传递给一个字符串。特别是,您传递了"10",它在字符串中出现了两次,因此它替换了两次。
如果你想尝试让这个工作,你可以改变你原来的代码看起来像
String newDate = date.replace(date.subString(date.indexOf("-"), date.lastIndexOf("-")), "-October");
这会将"-10" 替换为"-October"。由于"-10" 在字符串中只出现一次,它只会做一次替换。
如果您有一个将整数月份映射到名称的Map,您可以像这样使用它
Map<String, String> months = new HashMap<>();
months.put("10", "October");
String month = date.subString(date.indexOf("-"), date.lastIndexOf("-"));
String newDate = date.replace(month, "-" + months.get(month.subString(1)));
这会即时构建"-October",并将在其他月份工作,假设您使用它们填充地图。但正如其他人所指出的,使用 Java 的内置日期解析和格式化可能更可靠。