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

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



답변

이처럼 :

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

예를 들어

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

출력

lorem ipsum dolor sit.

그게 무슨 \s+뜻이야?

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


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


답변

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

(\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}"," ");


답변

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

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

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


답변

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

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

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


답변

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


답변

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

   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

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


답변

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

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

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

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