【问题标题】:Replacing a string using replaceAll or Pattern Matcher使用 replaceAll 或 Pattern Matcher 替换字符串
【发布时间】:2012-06-10 13:40:20
【问题描述】:

我需要用“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

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

【问题讨论】:

    标签: java string replace


    【解决方案1】:

    当您调用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() 会更好更简单。

    【讨论】:

      【解决方案2】:

      尝试重新分配方法返回的字符串。例如time = time.replaceAll("AM", "AM ET");

      【讨论】:

        猜你喜欢
        • 2011-06-13
        • 2013-02-16
        • 1970-01-01
        • 1970-01-01
        • 2014-09-08
        • 2011-04-06
        • 1970-01-01
        • 1970-01-01
        • 2019-02-11
        相关资源
        最近更新 更多