답변:
이처럼 :
yourString = yourString.replaceAll("\\s+", " ");
예를 들어
System.out.println("lorem ipsum dolor \n sit.".replaceAll("\\s+", " "));
출력
lorem ipsum dolor sit.
그게 무슨 \s+
뜻이야?
\s+
정규식입니다. \s
공백, 탭, 줄 바꿈, 캐리지 리턴, 용지 공급 또는 수직 탭과 일치하며 +
"하나 이상"으로 표시됩니다. 따라서 위의 코드는 하나의 공백 문자를 사용하여 한 문자보다 긴 모든 "공백 하위 문자열"을 축소합니다.
\s+
했지만 2 백 슬래시 \\는 무엇을 의미합니까?
"\\"
은 단일 백 슬래시로 구성된 문자열을 나타냅니다. 그래서 \s+
당신이 쓰는 것을 나타냅니다 "\\s+"
.
정규식을 사용할 수 있습니다
(\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}"," ");
안녕, 내가 찾은 가장 빠른 (하지만 가장 아름다운 방법은 아닙니다)
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+"," ");
이것은 세 단계로 가능합니다.