gpt4 book ai didi

java - 使用 replaceAll 或 Pattern Matcher 替换字符串

转载 作者:行者123 更新时间:2023-11-29 10:05:12 25 4
gpt4 key购买 nike

我需要用“8:00 AM ET - 5:00 PM ET”替换例如“8:00 AM - 5:00 PM”的字符串

我试过下面的代码,但它不起作用......

time.replaceAll("AM", "AM ET");
time.replaceAll("PM", "PM ET");
convertedTime = time;
System.out.println(convertedTime); // didnt get replaced

我尝试了下面的方法并且它工作但没有被正确替换,

Pattern p = Pattern.compile("(AM)");
Matcher m = p.matcher(time);
StringBuffer sb = new StringBuffer();
while(m.find()) {
m.appendReplacement(sb, "AM ET");
}
m.appendTail(sb);
p = Pattern.compile("(PM)");
m = p.matcher(time);
while(m.find()) {
m.appendReplacement(sb, "PM ET");
}
m.appendTail(sb);

System.out.println("sb: " + sb); // coming as sb: 8:00 AM ET - 5:00 PM8:00 AM - 5:00 PM ET

请告诉我为什么第一种方法不起作用,如果可以在第二种方法中更正。

最佳答案

当您调用 replaceAll() 方法时,它会返回一个具有修改后值的新 String - 它不会更改原始 String.

因此您的代码应该是...

String convertedTime = time.replaceAll("AM", "AM ET");
convertedTime = convertedTime.replaceAll("PM", "PM ET");
System.out.println(convertedTime);

甚至这个...

String convertedTime = time.replaceAll("AM", "AM ET").replaceAll("PM", "PM ET");
System.out.println(convertedTime);

由于上述代码的简单性,我真的不建议您使用基于模式的代码——它过于复杂而无法实现相同的结果。但是,就像您问的那样,您可能只需要将 m = p.matcher(time); 行更改为 m = p.matcher(sb.toString()); ,并清除您的 StringBuffer,这样您就可以将第一次修改的结果提供给第二个 p.matcher() 方法,并删除duplicate 在输出中。像这样的……

Pattern p = Pattern.compile("(AM)");
Matcher m = p.matcher(time);
StringBuffer sb = new StringBuffer();
while(m.find()) {
m.appendReplacement(sb, "AM ET");
}
m.appendTail(sb);
p = Pattern.compile("(PM)");
m = p.matcher(sb.toString()); // CHANGED
sb = new StringBuffer(); // ADDED
while(m.find()) {
m.appendReplacement(sb, "PM ET");
}
m.appendTail(sb);

System.out.println("sb: " + sb);

但是,正如我所说,仅使用 replaceAll() 会更好、更简单。

关于java - 使用 replaceAll 或 Pattern Matcher 替换字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10915924/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com