It's difficult to tell what is being asked here. This question is ambiguous, vague, incomplete, overly broad, or rhetorical and cannot be reasonably answered in its current form. For help clarifying this question so that it can be reopened, visit the help center
                            
                        
                    
                
                7年前关闭。
            
        

Java具有replace()和replaceAll()方法,以给定的新模式替换字符串的部分/序列。该功能的内部如何工作?如果我必须编写一个输入字符串OldPattern,NewPattern的函数,并且不使用RegEx递归地将每次出现的OldPattern替换为NewPattern怎么办?
我已经使用String输入的迭代完成了以下代码,它似乎可以正常工作。如果输入是characterArray而不是字符串怎么办?

  public String replaceOld(String aInput, String aOldPattern, String aNewPattern)
        {
             if ( aOldPattern.equals("") ) {
                throw new IllegalArgumentException("Old pattern must have content.");
             }

             final StringBuffer result = new StringBuffer();
             int startIdx = 0;
             int idxOld = 0;
             while ((idxOld = aInput.indexOf(aOldPattern, startIdx)) >= 0) {
               result.append( aInput.substring(startIdx, idxOld) );
               result.append( aNewPattern );

               //reset the startIdx to just after the current match, to see
               //if there are any further matches
               startIdx = idxOld + aOldPattern.length();
             }
             //the final chunk will go to the end of aInput
             result.append( aInput.substring(startIdx) );
             return result.toString();
          }

最佳答案

Java具有replace()和replaceAll()方法,以给定的新模式替换字符串的部分/序列。


确切地说,这些方法创建了替换了相关字符的新字符串。 Java字符串是不可变的。


  该功能的内部如何工作?


太复杂了,无法在此处详细说明。 (而且实际细节可能因一个实现而异)。最好的选择是自己阅读相关库类的源代码。 (源代码作为JDK的一部分分发,您的Java IDE应该可以向您显示它。或者,通过Google搜索,您可以在网络上找到它。)


  如果我必须编写一个输入字符串OldPattern,NewPattern的函数,并且不使用RegEx递归地将每次出现的OldPattern替换为NewPattern怎么办?


好吧,如果您正在谈论不使用Pattern类进行模式匹配/替换,那么是的,这很棘手……更不用说这是没有意义的。

(递归的解决方案可能很危险。请考虑以下问题:“用“ a”中的“ ba”递归替换“ a”的所有实例。结果应该是什么?您甚至应该尝试这样做吗?)



假设参数是简单的字符串(不是您所描述的模式),那么这是一个递归解决方案(未经测试):

public String replace1(String in, String target, String replacement) {
    if (target.isEmpty()) {
        return in;
    }
    int pos = in.indexOf(target);
    if (pos < 0) {
        return in;
    }
    String updated = in.substring(0, pos) + replacement +
                     in.substring(pos + target.length());
    return replace1(updated, target, replacement);
}


那解决了您希望递归替换的问题的版本;即您要替换由替换过程插入的target实例的位置。如果您不想这样做,那么:

public String replace2(String in, String target, String replacement) {
    if (target.isEmpty()) {
        return in;
    }
    int pos = in.indexOf(target);
    if (pos < 0) {
        return in;
    }
    return in.substring(0, pos) + replacement +
                     replace2(in.substring(pos + target.length()),
                             target, replacement);
}


请注意,这些方法最有可能比原始迭代解决方案效率低。即使忽略正在进行的所有字符串复制。 Java不执行尾调用优化。



1-如果您使用病理参数调用replace1,则将导致堆栈溢出。例如replace1("ab", "b", "b")

10-06 15:52
查看更多