답변:
에서 java.lang.String
의 replace
방법은 두 문자의 한 쌍 또는 한 쌍의 소요 CharSequence
(이 행복하게 문자열의 한 쌍을거야, 그래서 문자열 서브 클래스로되어있는) '들. 이 replace
메소드는 모든 문자 또는를 대체합니다 CharSequence
. 반면에, 모두 String
인수 replaceFirst
하고 replaceAll
정규 표현식 (정규식을)입니다. 잘못된 기능을 사용하면 미묘한 버그가 발생할 수 있습니다.
String#replace(target, replacement)
문자열을 인용하는 것 외에는 똑같은 일 이 있기 때문에 흥미로울 것입니다 . Pattern.compile(target.toString(), Pattern.LITERAL).matcher(this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
왜 String#replace
더 빠른 이유 가 String#replaceAll
있습니까? String#replace
추가 작업을 수행 하기 때문에 그렇게 보이지 않습니다 .
replaceAll
합니다. 이에 대한 자세한 내용은replace
Q : 나중에 정규식을 사용하는 것 이외 의 java.lang.String
방법 replace()
과 의 차이점은 무엇입니까?replaceAll()
A : 정규식입니다. 둘 다 모두 대체합니다 :)
http://docs.oracle.com/javase/6/docs/api/java/lang/String.html
추신:
또한 replaceFirst()
(정규식이 필요합니다)
CharSequence
. 모두 replace()
와 replaceAll()
"와 작업 CharSequence
". 그것은 그건 replaceAll()
주어진 고려 CharSequence
가 찾습니다 있도록 정규 표현식으로 정규식 일치 하면서, replace()
주어진 고려 CharSequence
가 찾습니다 있도록 일반 검색 텍스트로 발생 그것의.
모두 replace()
와 replaceAll()
String의 모든 항목을 대체합니다.
나는 항상 차이점을 이해하는 데 도움이되는 예를 찾습니다.
replace()
사용 replace()
이 좀 바꾸려면 char
서로 char
또는 어떤 String
다른과 String
(사실을 CharSequence
).
실시 예 1
모든 문자를 x
로 바꿉니다 o
.
String myString = "__x___x___x_x____xx_";
char oldChar = 'x';
char newChar = 'o';
String newString = myString.replace(oldChar, newChar);
// __o___o___o_o____oo_
실시 예 2
모든 문자열을 fish
로 바꿉니다 sheep
.
String myString = "one fish, two fish, three fish";
String target = "fish";
String replacement = "sheep";
String newString = myString.replace(target, replacement);
// one sheep, two sheep, three sheep
replaceAll()
정규식 패턴replaceAll()
을 사용 하려면 사용하십시오 .
실시 예 3
숫자를로 바꿉니다 x
.
String myString = "__1_6____3__6_345____0";
String regex = "\\d";
String replacement = "x";
String newString = myString.replaceAll(regex, replacement);
// __x_x____x__x_xxx____x
실시 예 4
공백을 모두 제거하십시오.
String myString = " Horse Cow\n\n \r Camel \t\t Sheep \n Goat ";
String regex = "\\s";
String replacement = "";
String newString = myString.replaceAll(regex, replacement);
// HorseCowCamelSheepGoat
선적 서류 비치
replace(char oldChar, char newChar)
replace(CharSequence target, CharSequence replacement)
replaceAll(String regex, String replacement)
replaceFirst(String regex, String replacement)
정규식
이 replace()
메소드는 기본 요소 char
와 CharSequence
인수 를 모두 인수로 오버로드됩니다 .
이제 성능과 관련하여 replace()
방법이 약간 빠릅니다.replaceAll()
후자는 먼저 정규식 패턴을 컴파일 한 다음 최종적으로 교체하기 전에 일치하는 반면, 전자는 단순히 제공된 인수와 일치하고 대체하기 때문에 .
정규식 패턴 일치가 조금 더 복잡하고 결과적으로 느리다는 것을 알고 있으므로 가능할 때마다 선호 replace()
하는 replaceAll()
것이 좋습니다.
예를 들어, 당신이 언급 한 간단한 대체의 경우 다음을 사용하는 것이 좋습니다.
replace('.', '\\');
대신에:
replaceAll("\\.", "\\\\");
참고 : 위의 변환 방법 인수는 시스템에 따라 다릅니다.
Pattern.compile(...)
구현에서 내용 / 부분이 나타나기 replace
때문에 첫 번째 인수를 정의 / 전송하는 방법에 대해서는 덜 복잡합니다. 필요하지 않습니다 "\"
. 또한 replace
자바부터 사용할 수 있습니다 1.5
및 replaceAll
이후1.4
replace ()가 replaceAll ()보다 빠르게 작동한다는 것은 사실이 아닙니다.
Pattern.compile (regex) .matcher (this) .replaceAll (replacement);
이제 질문은 replace 사용시기와 replaceAll () 사용시기입니다. 문자열에서 발생하는 위치에 관계없이 하위 문자열을 다른 하위 문자열로 바꾸려면 replace ()를 사용하십시오. 그러나 문자열의 시작 또는 끝에 하위 문자열 만 바꾸는 것과 같은 특정 환경 설정이나 조건이 있으면 replaceAll ()을 사용하십시오. 내 요점을 증명하는 몇 가지 예는 다음과 같습니다.
String str = new String("==qwerty==").replaceAll("^==", "?"); \\str: "?qwerty=="
String str = new String("==qwerty==").replaceAll("==$", "?"); \\str: "==qwerty?"
String str = new String("===qwerty==").replaceAll("(=)+", "?"); \\str: "?qwerty?"
replace
호출하지 않습니다 Pattern.compile(regex).matcher(this).replaceAll(replacement);
. 전화Pattern.compile(target.toString(), Pattern.LITERAL).matcher(this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
wickeD의 답변에서 알 수 있듯이 replaceAll을 사용하면 replace 및 replaceAll 사이에서 교체 문자열이 다르게 처리됩니다. a [3]과 a [4]는 같은 값을 가질 것으로 예상했지만 서로 다릅니다.
public static void main(String[] args) {
String[] a = new String[5];
a[0] = "\\";
a[1] = "X";
a[2] = a[0] + a[1];
a[3] = a[1].replaceAll("X", a[0] + "X");
a[4] = a[1].replace("X", a[0] + "X");
for (String s : a) {
System.out.println(s + "\t" + s.length());
}
}
이것의 결과는 다음과 같습니다.
\ 1
X 1
\X 2
X 1
\X 2
이는 교체에 추가 수준의 이스케이프가 필요하지 않은 perl과 다릅니다.
#!/bin/perl
$esc = "\\";
$s = "X";
$s =~ s/X/${esc}X/;
print "$s " . length($s) . "\n";
\ X 2를 인쇄합니다
이것은 java.sql.DatabaseMetaData.getSearchStringEscape ()에 의해 리턴 된 값을 replaceAll ()과 함께 사용하려고 할 때와 같이 상당히 성 가실 수 있습니다.
내가 알고있는 오래된 스레드이지만 Java에 익숙하지 않고 이상한 것 중 하나를 발견합니다. 나는 사용했다String.replaceAll()
했지만 예기치 않은 결과를 얻었습니다.
이 같은 것이 문자열을 엉망으로 만듭니다.
sUrl = sUrl.replaceAll( "./", "//").replaceAll( "//", "/");
그래서 이상한 문제를 해결하기 위해이 기능을 설계했습니다.
//String.replaceAll does not work OK, that's why this function is here
public String strReplace( String s1, String s2, String s )
{
if((( s == null ) || (s.length() == 0 )) || (( s1 == null ) || (s1.length() == 0 )))
{ return s; }
while( (s != null) && (s.indexOf( s1 ) >= 0) )
{ s = s.replace( s1, s2 ); }
return s;
}
당신이 할 수있는 것 :
sUrl=this.strReplace("./", "//", sUrl );
sUrl=this.strReplace( "//", "/", sUrl );
이미 선택된 "Best Answer"(및 Suragch와 같은 다른 것)에 추가하려면 String.replace()
순차적 인 문자를 대체하여 제한됩니다 (따라서 CharSequence
). 그러나 String.replaceAll()
순차 문자 만 대체하여 제한되지는 않습니다. 정규식이 그런 식으로 구성되는 한 비 순차적 문자를 대체 할 수 있습니다.
또한 (가장 중요하고 고통스럽게도 분명) replace()
리터럴 값만 대체 할 수 있습니다. 반면 replaceAll
'유사'시퀀스를 대체 할 수 있습니다 (반드시 동일 할 필요는 없음).
replace()
메서드는 정규식 패턴을 사용하지 않지만 replaceAll()
메서드는 정규식 패턴을 사용합니다. 그래서 replace()
보다 더 빨리 수행합니다 replaceAll()
.
str.replaceAll(regex, repl)
동일합니다Pattern.compile(regex).matcher(str).replaceAll(repl)
. 따라서 사용되는 양에 따라 큰 오버 헤드가 있습니다.