내가 뭔가를 놓치고 있거나 StringBuilder에 일반 String 클래스가 수행하는 동일한 “문자열 A의 모든 발생을 문자열 B로 교체”기능이 부족합니까? StringBuilder 교체 기능은 완전히 동일하지 않습니다. 일반 String 클래스를 사용하여 여러 문자열을 생성하지 않고 더 효율적으로이를 수행 할 수있는 방법이 있습니까?
답변
글쎄, 루프를 작성할 수 있습니다.
public static void replaceAll(StringBuilder builder, String from, String to)
{
int index = builder.indexOf(from);
while (index != -1)
{
builder.replace(index, index + from.length(), to);
index += to.length(); // Move to the end of the replacement
index = builder.indexOf(from, index);
}
}
경우에 lastIndexOf
따라 뒤쪽에서 작업하는 것이 더 빠를 수 있습니다 . 긴 문자열을 짧은 문자열로 바꾸는 경우가 그렇다고 생각합니다. 따라서 처음부터 교체 할 경우 복사 할 것이 적습니다. 어쨌든 이것은 시작점을 제공 할 것입니다.
답변
답변
@Adam : 코드 스 니펫에서 m.find ()의 시작 위치를 추적해야한다고 생각합니다. 문자열 교체는 마지막 문자가 일치 한 후 오프셋을 변경할 수 있기 때문입니다.
public static void replaceAll(StringBuilder sb, Pattern pattern, String replacement) {
Matcher m = pattern.matcher(sb);
int start = 0;
while (m.find(start)) {
sb.replace(m.start(), m.end(), replacement);
start = m.start() + replacement.length();
}
}
답변
String 클래스 의 replaceAll 메소드의 JavaDoc을 살펴보십시오 .
주어진 정규식과 일치하는이 문자열의 각 부분 문자열을 주어진 대체로 바꿉니다. str.replaceAll (regex, repl) 형식의이 메소드를 호출하면 표현식과 정확히 동일한 결과가 생성됩니다.
java.util.regex.Pattern.compile (regex) .matcher (str) .replaceAll (repl)
보시다시피 Pattern 및 Matcher 를 사용 하여 수행 할 수 있습니다 .
답변
클래스 org.apache.commons.lang3.text.StrBuilder
에서 아파치 코 몬즈 랭은 교체 할 수 있습니다 :
public StrBuilder replaceAll(String searchStr, String replaceStr)
* 정규식이 아닌 간단한 문자열을받습니다.
답변
간단한 것조차도 String ReplaceAll 함수 자체를 사용하는 것입니다. 다음과 같이 쓸 수 있습니다.
StringBuilder sb = new StringBuilder("Hi there, are you there?")
System.out.println(Pattern.compile("there").matcher(sb).replaceAll("niru"));
답변
예. String.replaceAll()
방법 을 사용 하는 것은 매우 간단합니다 .
package com.test;
public class Replace {
public static void main(String[] args) {
String input = "Hello World";
input = input.replaceAll("o", "0");
System.out.println(input);
}
}
산출:
Hell0 W0rld
StringBuilder.replace(int start, int end, String str)
대신 사용하고 싶다면 여기로 가십시오.
public static void main(String args[]) {
StringBuilder sb = new StringBuilder("This is a new StringBuilder");
System.out.println("Before: " + sb);
String from = "new";
String to = "replaced";
sb = sb.replace(sb.indexOf(from), sb.indexOf(from) + from.length(), to);
System.out.println("After: " + sb);
}
산출:
Before: This is a new StringBuilder
After: This is a replaced StringBuilder