[java] String replace ()와 replaceAll ()의 차이점

나중에 정규식을 사용하는 것 외에 java.lang.String replace()replaceAll()메소드 의 차이점은 무엇입니까 ? 교체 같은 간단한 대체의 경우 ./ 어떤 차이가?



답변

에서 java.lang.Stringreplace방법은 두 문자의 한 쌍 또는 한 쌍의 소요 CharSequence(이 행복하게 문자열의 한 쌍을거야, 그래서 문자열 서브 클래스로되어있는) ‘들. 이 replace메소드는 모든 문자 또는를 대체합니다 CharSequence. 반면에, 모두 String인수 replaceFirst하고 replaceAll정규 표현식 (정규식을)입니다. 잘못된 기능을 사용하면 미묘한 버그가 발생할 수 있습니다.


답변

Q : 나중에 정규식을 사용하는 것 이외 의 java.lang.String방법 replace()과 의 차이점은 무엇입니까?replaceAll()

A : 정규식입니다. 둘 다 모두 대체합니다 🙂

http://docs.oracle.com/javase/6/docs/api/java/lang/String.html

추신:

또한 replaceFirst()(정규식이 필요합니다)


답변

모두 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()메소드는 기본 요소 charCharSequence인수 를 모두 인수로 오버로드됩니다 .

이제 성능과 관련하여 replace()방법이 약간 빠릅니다.replaceAll() 후자는 먼저 정규식 패턴을 컴파일 한 다음 최종적으로 교체하기 전에 일치하는 반면, 전자는 단순히 제공된 인수와 일치하고 대체하기 때문에 .

정규식 패턴 일치가 조금 더 복잡하고 결과적으로 느리다는 것을 알고 있으므로 가능할 때마다 선호 replace()하는 replaceAll()것이 좋습니다.

예를 들어, 당신이 언급 한 간단한 대체의 경우 다음을 사용하는 것이 좋습니다.

replace('.', '\\');

대신에:

replaceAll("\\.", "\\\\");

참고 : 위의 변환 방법 인수는 시스템에 따라 다릅니다.


답변

String replace(char oldChar, char newChar)

이 문자열에서 모든 oldChar 발생을 newChar로 바꾼 결과로 새 문자열을 리턴합니다.

String replaceAll(String regex, String replacement

주어진 정규 표현식과 일치하는이 문자열의 각 부분 문자열을 주어진 대체로 바꿉니다.


답변

  1. replace ()와 replaceAll ()은 두 개의 인수를 허용하고 문자열에서 첫 번째 하위 문자열 (첫 번째 인수)의 모든 항목을 두 번째 하위 문자열 (두 번째 인수)로 바꿉니다.
  2. replace ()는 char 또는 charsequence 쌍을 허용하고 replaceAll ()은 정규 표현식 쌍을 허용합니다.
  3. 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?"


답변

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 ()과 함께 사용하려고 할 때와 같이 상당히 성 가실 수 있습니다.