Java를 사용하여 문자열에서 중복 공백을 제거하는 방법은 무엇입니까?


147

Java를 사용하여 문자열에서 중복 공백 (탭, 줄 바꿈, 공백 등 포함)을 제거하는 방법은 무엇입니까?

답변:


378

이처럼 :

yourString = yourString.replaceAll("\\s+", " ");

예를 들어

System.out.println("lorem  ipsum   dolor \n sit.".replaceAll("\\s+", " "));

출력

lorem ipsum dolor sit.

그게 무슨 \s+뜻이야?

\s+정규식입니다. \s공백, 탭, 줄 바꿈, 캐리지 리턴, 용지 공급 또는 수직 탭과 일치하며 +"하나 이상"으로 표시됩니다. 따라서 위의 코드는 하나의 공백 문자를 사용하여 한 문자보다 긴 모든 "공백 하위 문자열"을 축소합니다.


출처 : Java : 문자열에서 중복 공백 제거


3
@SuhrobSamiev-String.replaceAll ()은 JDK 1.4부터 Java로 사용되었습니다. docs.oracle.com/javase/1.4.2/docs/api/java/lang/… , java.lang.String)
David Moles

3
\ s +에 대한 멋진 설명을 위해 +1 이상을 추가 할 수 있기를 바랍니다.
Cyntech

이해 \s+했지만 2 백 슬래시 \\는 무엇을 의미합니까?
saplingPro

2
문자열 리터럴 "\\"은 단일 백 슬래시로 구성된 문자열을 나타냅니다. 그래서 \s+당신이 쓰는 것을 나타냅니다 "\\s+".
aioobe

1
캐리지 리턴이 제거됩니까? 아니면 "\\ r"을 별도로 제거해야합니까? 감사!
user3388884

24

정규식을 사용할 수 있습니다

(\s)\1

로 교체하십시오 $1.

자바 코드 :

str = str.replaceAll("(\\s)\\1","$1");

입력이 경우 "foo\t\tbar "당신은거야 "foo\tbar "출력으로
그러나 입력이 경우 "foo\t bar"는 어떤 연속적인 공백 문자를 갖고 있지 않기 때문에이 변경되지 않습니다.

당신이 공간으로 모든 공백 문자 (공간, 수직 탭, 수평 탭, 캐리지 리턴, 폼 피드, 새로운 라인)을 치료하는 경우에 당신은 대체하기 위해 다음과 같은 정규 표현식을 사용할 수 있는 하나의 공간 연속 된 공간의 수를 :

str = str.replaceAll("\\s+"," ");

그러나 두 개의 연속 공백을 단일 공백으로 바꾸려면 다음을 수행하십시오.

str = str.replaceAll("\\s{2}"," ");

9

이것을 시도하십시오-당신은해야합니다 import java.util.regex.*;

    Pattern pattern = Pattern.compile("\\s+");
    Matcher matcher = pattern.matcher(string);
    boolean check = matcher.find();
    String str = matcher.replaceAll(" ");

string중복 공백을 제거 해야하는 문자열은 어디에 있습니까?


9

안녕, 내가 찾은 가장 빠른 (하지만 가장 아름다운 방법은 아닙니다)

while (cleantext.indexOf("  ") != -1)
  cleantext = StringUtils.replace(cleantext, "  ", " ");

이것은 정규식과 반대로 안드로이드에서 꽤 빠르게 실행됩니다.


1
공백에 대해서만 작동하지만 탭 및 줄 바꿈과 같은 다른 공백에는 작동하지 않습니다.
Pang

1
다른 엔티티에 대해 더 많은 while 루프를 추가해야한다는 것을 알고 있습니다. 그러나이 코드는 안드로이드에서 훨씬 더 빠르게 실행됩니다. 정규 전자 책을 처리해야했습니다.
wutzebaer

데스크탑에서도 훨씬 더 빠릅니다. 큰 문자열을 테스트하지는 않았지만 많은 작은 문자열에서 실행할 계획이라면 이것이 당신이 찾고있는 대답입니다.
Ivelate

9
String str = "   Text    with    multiple    spaces    ";
str = org.apache.commons.lang3.StringUtils.normalizeSpace(str);
// str = "Text with multiple spaces"

6

너무 늦었지만 모든 연속 된 동일한 유형의 공백을 해당 유형의 하나의 공백으로 대체하는 더 나은 솔루션 (나에게 효과적 임)을 발견했습니다. 그건:

   Hello!\n\n\nMy    World  

될거야

 Hello!\nMy World 

여전히 앞뒤 공백이 있습니다. 그래서 내 완전한 해결책은 다음과 같습니다.

str = str.trim().replaceAll("(\\s)+", "$1"));

여기에서 trim()모든 선행 및 후행 공백 문자열을 ""로 바꿉니다. 그룹 # 1 에서 (\\s)캡처하기위한 것입니다 \\s(즉, '', '\ n', '\ t'와 같은 공백) . 부호는 하나 이상의 선행 토큰을 일치시키기위한 것입니다. 따라서 단일 공백 ​​문자 ( '', '\ n'또는 '\ t') 중 연속 문자 (1 이상)가 될 수 있습니다. 일치하는 문자열을 일치하는 유형 (즉, 일치하는 단일 공백 ​​문자)의 그룹 # 1 문자열 (1 개의 공백 문자 만 포함 )로 바꾸는 데 사용 됩니다. 위의 솔루션은 다음과 같이 변경됩니다.+(\\s)+$1

   Hello!\n\n\nMy    World  

될거야

Hello!\nMy World

위의 해결책을 찾지 못하여 게시했습니다.


0

모든 선행 및 후행 외부 공백을 제거하려면 다음과 같이하십시오.

// \\A = Start of input boundary
// \\z = End of input boundary 
string = string.replaceAll("\\A\\s+(.*?)\\s+\\z", "$1");

그런 다음 여기에 나열된 다른 전략을 사용하여 중복을 제거 할 수 있습니다.

string = string.replaceAll("\\s+"," ");

0

공간, 탭, 줄 바꿈 및 모두에 대해 문자열 토큰을 사용할 수도 있습니다. 간단한 방법은

String s = "Your Text Here";        
StringTokenizer st = new StringTokenizer( s, " " );
while(st.hasMoreTokens())
{
    System.out.print(st.nextToken());
}

-10

이것은 세 단계로 가능합니다.

  1. 문자열을 문자형 배열 (ToCharArray)로 변환
  2. 문자 배열에서 루프 적용
  3. 그런 다음 문자열 바꾸기 기능을 적용하십시오 (바꾸십시오 ( "바꾸고 싶은 위치", "원래 문자열")).

1
그것은 좋은 해결책이 아니며 char 배열로 떨어지면 아무것도 해결되지 않습니다. 실제로 문제를 해결하는 방법을 설명하지 않습니다. 또한 완전히 관련이없는 링크를 게시 하지 마십시오 . 그렇게하면 스패머로 표시됩니다.
Mat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.