Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.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 使用replaceAll或模式匹配器替换字符串_Java_String_Replace - Fatal编程技术网

Java 使用replaceAll或模式匹配器替换字符串

Java 使用replaceAll或模式匹配器替换字符串,java,string,replace,Java,String,Replace,我需要用“东部时间上午8:00-下午5:00”替换一个字符串,例如“东部时间上午8:00-下午5:00” 我已经尝试了以下代码,但它不工作 time.replaceAll("AM", "AM ET"); time.replaceAll("PM", "PM ET"); convertedTime = time; System.out.println(convertedTime); // didnt get replaced 我试过下面的方法,但没有得到正确的更换 Pattern p = Patt

我需要用“东部时间上午8:00-下午5:00”替换一个字符串,例如“东部时间上午8:00-下午5:00”

我已经尝试了以下代码,但它不工作

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 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(时间)行到
m=p.matcher(sb.toString())
,并清除
StringBuffer
,以便将第一次修改的结果输入到第二个
p.matcher()
方法中,并删除输出中的
副本。像这样的

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()

会更好、更简单。当调用
replaceAll()
方法时,它会返回一个新的
字符串和修改后的值-它不会更改原始的
字符串

因此,您的代码应该是

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(时间)行到
m=p.matcher(sb.toString())
,并清除
StringBuffer
,以便将第一次修改的结果输入到第二个
p.matcher()
方法中,并删除输出中的
副本。像这样的

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()

尝试重新分配方法返回的字符串会更好、更简单。e、 g.
time=time.replaceAll(“AM”、“AM ET”)

尝试重新分配方法返回的字符串。e、 g.
time=time.replaceAll(“AM”、“AM ET”)