Java使用子字符串函数的索引在两个字符之间的字符串中替换字符

时间:2018-11-02 10:19:56

标签: java replace substring

我在字符串中有一个这样的日期:10-10-2018,我希望将其显示为2018年10月10日,我正在执行以下操作:

String date = "10-10-2018";
String newDate = date.replace(date.subString(date.indexOf("-")+1,date.lastIndexOf("-")),"October");

不是得到2018年10月10日,而是得到2018年10月10日,尽管我选择的是“-”符号之间的中间一个,但为什么两个实例都被替换为10。我想念什么。

3 个答案:

答案 0 :(得分:4)

一个简单的问题是,在存在相同子字符串的其他实例的字符串中,您将字符串"10"替换为"October"

您的通话等效于:

date.replace("10", "October");

这也将替换"10"的第一个实例。 String.replace的文档包含以下内容:

  

用指定的文字替换序列替换此字符串中与文字目标序列匹配的每个子字符串。替换从字符串的开头到结尾进行,例如,将字符串“ aaa”中的“ aa”替换为“ b”将得到“ ba”而不是“ ab”。

一种更可靠的方法是使用日期/时间API来解析和格式化日期:

String date = "10-10-2018";
LocalDate d = LocalDate.parse(date, DateTimeFormatter.ofPattern("dd-MM-yyyy"));
String newDate = d.format(DateTimeFormatter.ofPattern("dd-MMMM-yyyy"));

newDate的评估值为"10-October-2018"

答案 1 :(得分:0)

这就是您需要的:)

long ret = strtol(temp, NULL, 10);  // Don't care about end ptr; strtol won't set on NULL

答案 2 :(得分:0)

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的内置日期解析和格式化可能更可靠。