Java 두 줄 이상의 공백을 문자열의 단일 공백으로 바꾸고 선행 및 후행 공백을 삭제하는 방법


271

Java에서이 문자열을 변경하는 빠르고 간단한 방법을 찾고 있습니다.

" hello     there   "

이런 식으로

"hello there"

여기서 문자열의 시작 부분에 하나 이상의 공백이 없어지기를 제외하고는 여러 공백을 모두 단일 공백으로 바꿉니다.

이 같은 것은 나를 부분적으로 데려다

String mytext = " hello     there   ";
mytext = mytext.replaceAll("( )+", " ");

그러나 그렇지 않습니다.


5
답변 수락을 고려해야합니다. 나중에 페이지에 도착한 사람들이 결정적인 솔루션을 훨씬 쉽게 선택할 수 있습니다.
Paul Rooney

1
이것은 가장 권장되는 방법 중 하나입니다. =>. String nameWithProperSpacing = StringUtils.normalizeSpace (stringWithLotOfSpaces);
Kunal Vohra '

s = s.replaceAll ( "\\ s +", "");
Saroj Kumar Sahoo

답변:


461

이 시도:

String after = before.trim().replaceAll(" +", " ");

또한보십시오


trim()정규식 없음

하나만 사용 하여이 작업을 수행 할 수도 replaceAll있지만 trim()솔루션 보다 읽기 쉽지 않습니다 . 그럼에도 불구하고 여기에 정규식이 무엇을 할 수 있는지 보여주기 위해 제공됩니다.

    String[] tests = {
        "  x  ",          // [x]
        "  1   2   3  ",  // [1 2 3]
        "",               // []
        "   ",            // []
    };
    for (String test : tests) {
        System.out.format("[%s]%n",
            test.replaceAll("^ +| +$|( )+", "$1")
        );
    }

3 가지 대안이 있습니다 :

  • ^_+ : 문자열의 시작 부분에있는 일련의 공백
    • $1빈 문자열을 캡처하는로 일치 및 바꾸기
  • _+$ : 문자열 끝에있는 일련의 공백
    • $1빈 문자열을 캡처하는로 일치 및 바꾸기
  • (_)+ : 위의 어느 것과도 일치하지 않는 모든 일련의 공백, 즉 중간에 있음을 의미합니다.
    • $1단일 공간을 캡처하는로 일치 및 교체

또한보십시오


11
하나는하고 있다는 지적 그것의 가치, 특히 trim()다음과 replaceAll()주위에 그것을 다른 방법으로하는 것보다 적은 메모리를 사용합니다. 그다지 많지는 않지만, 이것이 여러 번 호출되면, 특히 "잘라낼 수있는 공백"이 많은 경우 더해질 수 있습니다. ( Trim()실제로 여분의 공간을 제거하지는 않습니다. 시작 값과 끝 값을 이동하여 숨 깁니다. 기본 char[]은 변경되지 않습니다.)
corsiKa

2
그것은 단지 세부 사항입니다,하지만 난 생각 ( ) +이나 ( ){2,}A (아주) 조금 더 효율적이어야한다)
sp00m

6
좋은 정규식. 참고 :``를 공백으로 바꾸면 \\s공백 그룹이 원하는 문자로 바뀝니다.
djmj

1
() + 부분은 단일 공백과 일치하고 단일 공백으로 대체합니다. 아마도 (<space> <space> +)가 더 좋을 것이므로 공백이 여러 개인 경우에만 일치하고 대체는 문자열을 완전히 변경합니다.
Lee Meador

2
Lee Meador가 언급했듯이 .trim().replaceAll(" +", " ")(두 공백)는 .trim().replaceAll(" +", " ")(한 공백) 보다 빠릅니다 . 단일 공백과 모든 이중 공백이있는 문자열에서 타이밍 테스트를 실행했으며 많은 작업 (환경에 따라 수백만 이상)을 수행 할 때 두 가지 모두에 대해 훨씬 빠릅니다 .
게리 S. 위버

154

당신은 단지 필요합니다 :

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

하나 이상의 공백을 일치시키고 공백을 단일 공백으로 바꾸고 시작과 끝에서 공백을 자릅니다 (먼저 누군가 지적한대로 정규 표현식을 더 빨리 만들기 위해 먼저 자르고 일치시켜 반전시킬 수 있습니다).

이것을 빨리 테스트하려면 다음을 시도하십시오.

System.out.println(new String(" hello     there   ").trim().replaceAll("\\s{2,}", " "));

그리고 그것은 반환됩니다 :

"hello there"

3
아마 정규식을 약간 저장하기 때문에 먼저 다듬을 것입니다.
Michael

3
@ sarah.ferguson 첫 번째 replaceAll에 없어야하는 마지막 대괄호 ")"를 제거하십시오. 감사. -시스템은 그렇게 할 수 없습니다! (아무것도 6 개 문자가 편집을받을 수 미만 ..)
mwarren

2
여러 공간이 함께 있지 않은 경우 하나의 공간을 다른 공간으로 대체합니다. 하나의 탭을 단일 공백으로 교체하기 때문에 원하는 경우 교체를 수행 할 필요가 없습니다. 여러 공간 만 인식하는 것이 좋습니다.
Lee Meador

2
@geowar 질문에 탭을 요청한 부분이 있습니까? 나는 위의 잘 그 문제에 대해 같은 기호를 ☮ 대체하지 않습니다 .. 어느 쪽도 아니 ✌ ... 확신
sarah.ferguson

2
두 번째 @geowar 대기 이것은 단일 테이블을 공백으로 대체합니다. 방금 시도했습니다
user1870400


20

이것은 나를 위해 완벽하게 작동했습니다. sValue = sValue.trim().replaceAll("\\s+", " ");


1
사람들이 내 답변을 편집했습니다. 원래는 다음과 같습니다. sValue = sValue.replaceAll ( "\ s +", "") .trim ();
Doctor

2
원래 답변이 모든 공간을 제거하고 OP가 요청한 내용이 아니기 때문에 편집되었습니다.
Jose Rui Santos

17
"[ ]{2,}"

이것은 둘 이상의 공간과 일치합니다.

String mytext = " hello     there   ";
//without trim -> " hello there"
//with trim -> "hello there"
mytext = mytext.trim().replaceAll("[ ]{2,}", " ");
System.out.println(mytext);

산출:

hello there

13

문자열의 시작과 끝에 공백을 제거하려면 String#trim()method를 사용하십시오 . 그런 다음을 사용하십시오 mytext.replaceAll("( )+", " ").


12

String.trim()먼저을 사용한 다음 결과에 regex replace 명령을 적용 할 수 있습니다 .


10
trim ()은 문자열의 시작과 끝에서 모든 공백을 제거합니다. 단어 사이의 공백에는 적용되지 않습니다
vuhung3990

10

다음 코드는 단어 사이의 공백을 압축하고 문자열의 시작과 끝에서 공백을 제거합니다.

String input = "\n\n\n  a     string with     many    spaces,    \n"+
               " a \t tab and a newline\n\n";
String output = input.trim().replaceAll("\\s+", " ");
System.out.println(output);

출력됩니다 a string with many spaces, a tab and a newline

공백, 탭 및 줄 바꿈을 포함하여 인쇄 할 수없는 문자는 압축되거나 제거됩니다.


자세한 내용은 해당 설명서를 참조하십시오.


9

이거 한번 해봐.

샘플 코드

String str = " hello     there   ";
System.out.println(str.replaceAll("( +)"," ").trim());

산출

hello there

먼저 모든 공간을 단일 공간으로 대체합니다. 우리가 트림을하고 가정 한 것보다 String의 시작 때문에 String의 및 최종 String경우는 하나의 공간으로 모든 공간을 대체 할 String의 시작에 공백이 String의 및 종료 String우리가 트림 할 필요가 그래서. 당신이 원하는 것보다 String.


4

둘러보기도 사용할 수 있습니다.

test.replaceAll("^ +| +$|(?<= ) ", "");

또는

test.replaceAll("^ +| +$| (?= )", "")

<space>(?= )공백 문자 다음에 다른 공백 문자가옵니다. 따라서 연속 공백에서는 공백 문자가 뒤에 나오지 않기 때문에 마지막 공백을 제외한 모든 공백과 일치합니다. 이렇게하면 제거 작업 후 연속 공간을위한 단일 공간이 남습니다.

예:

    String[] tests = {
            "  x  ",          // [x]
            "  1   2   3  ",  // [1 2 3]
            "",               // []
            "   ",            // []
        };
        for (String test : tests) {
            System.out.format("[%s]%n",
                test.replaceAll("^ +| +$| (?= )", "")
            );
        }

당신이 그것을 가지고있는 방식으로, 그것은 앞이나 끝에있는 공간이나 그 뒤에 다른 공간과 하나의 공간과 일치합니다. 즉, "a .... b"는 3 번 일치하고 3 번 대체됩니다. replaceAll () 메서드 내부의 모든 내부 공간을 반복합니다. 아마도 한 번에 두 개 이상의 공백 순서와 일치하도록 변경하고 내부 반복을 줄일 수 있습니다.
Lee Meador

아마도 <space> + (? = <space>)는 그렇게 할 것입니다.
Lee Meador

4

손질()

선행 및 후행 공백 만 제거합니다.

Java Doc에서 "앞뒤 공백이 제거 된 값을이 문자열로 반환합니다."

System.out.println(" D ev  Dum my ".trim());

"Dev Dum my"

replace (), replaceAll ()

단어의 빈 문자열을 모두 바꿉니다.

System.out.println(" D ev  Dum my ".replace(" ",""));

System.out.println(" D ev  Dum my ".replaceAll(" ",""));

System.out.println(" D ev  Dum my ".replaceAll("\\s+",""));

산출:

"DevDummy"

"DevDummy"

"DevDummy"

참고 : "\ s +"는 공백 문자와 유사한 정규식입니다.

참조 : https://www.codedjava.com/2018/06/replace-all-spaces-in-string-trim.html


4

지금까지 많은 정답이 제공되었으며 많은 공감대가 보입니다. 그러나 언급 된 방법은 작동하지만 실제로 최적화되지 않았거나 실제로 읽을 수는 없습니다. 나는 최근에 모든 개발자가 원하는 솔루션을 발견했습니다.

String nameWithProperSpacing = StringUtils.normalizeSpace( stringWithLotOfSpaces );

끝났습니다. 이것은 읽기 쉬운 솔루션입니다.


3

Kotlin에서는 다음과 같이 보입니다.

val input = "\n\n\n  a     string with     many    spaces,    \n"
val cleanedInput = input.trim().replace(Regex("(\\s)+"), " ")

2
String str = " hello world"

먼저 공백을 줄이십시오

str = str.trim().replaceAll(" +", " ");

첫 글자를 대문자로하고 다른 모든 것을 소문자로

str = str.substring(0,1).toUpperCase() +str.substring(1,str.length()).toLowerCase();

2
mytext = mytext.replaceAll("\\s+"," ");

코드 전용 답변은 권장하지 않습니다. 편집을 클릭하고 코드가 질문을 어떻게 처리하는지 요약하는 단어를 추가하거나 이전 답변과 어떻게 다른지 설명하십시오. 감사합니다
Nick

1

이것은 나를 위해 일했다

scan= filter(scan, " [\\s]+", " ");
scan= sac.trim();

여기서 filter는 기능을 따르고 scan은 입력 문자열입니다.

public String filter(String scan, String regex, String replace) {
    StringBuffer sb = new StringBuffer();

    Pattern pt = Pattern.compile(regex);
    Matcher m = pt.matcher(scan);

    while (m.find()) {
        m.appendReplacement(sb, replace);
    }

    m.appendTail(sb);

    return sb.toString();
}

1
이것은 <space> <tab>을 공백으로 대체하지만 <tab> <tab>은 대체하지 않습니다. 그것은 사소한 문제입니다.
Lee Meador

1

당신은 이렇게해야합니다

String mytext = " hello     there   ";
mytext = mytext.replaceAll("( +)", " ");

둥근 괄호 안에 +를 넣으십시오.


1
String str = "  this is string   ";
str = str.replaceAll("\\s+", " ").trim();

0

참조하십시오 String.replaceAll.

정규식을 사용 "\s"하고로 교체하십시오 " ".

그런 다음을 사용하십시오 String.trim.


1
new String ( "hello there") .replaceAll ( "\\ s", "+")는 + hello +++++++를 반환하므로 확실히 작동하지 않습니다 ..
sarah.ferguson

1
시도new String(" hello there ").trim().replaceAll("\\s+", " ")
manish_s

0

이것을 확인하십시오 ...

public static void main(String[] args) {
    String s = "A B  C   D    E F      G\tH I\rJ\nK\tL";
    System.out.println("Current      : "+s);
    System.out.println("Single Space : "+singleSpace(s));
    System.out.println("Space  count : "+spaceCount(s));
    System.out.format("Replace  all = %s", s.replaceAll("\\s+", ""));

    // Example where it uses the most.
    String s = "My name is yashwanth . M";
    String s2 = "My nameis yashwanth.M";

    System.out.println("Normal  : "+s.equals(s2));
    System.out.println("Replace : "+s.replaceAll("\\s+", "").equals(s2.replaceAll("\\s+", "")));

} 

String에 공백이 하나만 있으면 replace ()는 대체되지 않습니다.

공백이 둘 이상이면 replace () 조치가 공백을 수행하고 제거합니다.

public static String singleSpace(String str){
    return str.replaceAll("  +|   +|\t|\r|\n","");
}

문자열의 공백 수를 계산합니다.

public static String spaceCount(String str){
    int i = 0;
    while(str.indexOf(" ") > -1){
      //str = str.replaceFirst(" ", ""+(i++));
        str = str.replaceFirst(Pattern.quote(" "), ""+(i++)); 
    }
    return str;
}

Pattern .quote ( "?")는 리터럴 패턴 문자열을 리턴합니다.


0

정규식을 더 나은 솔루션으로 사용하여 두 번째 답변을 발견하기 전에 내 방법. 누군가이 코드가 필요할 수 있습니다.

private String replaceMultipleSpacesFromString(String s){
    if(s.length() == 0 ) return "";

    int timesSpace = 0;
    String res = "";

    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);

        if(c == ' '){
            timesSpace++;
            if(timesSpace < 2)
                res += c;
        }else{
            res += c;
            timesSpace = 0;
        }
    }

    return res.trim();
}

흥미롭지 만 공백은 단순한 공백 이상을 의미합니다.
Laur Ivan

@LaurIvan 무슨 뜻인가요?
trinity420

이 항목 에는 \s정규식 (공백, 탭, 줄 바꾸기, 양식 공급)의 의미에 대한 설명이 있습니다.
Laur Ivan

@LaurIvan 링크가 끊어졌지만 옳습니다. 이 문제는 입력 문자열을 반복하고 알파벳이 아닌 숫자, 공백이 아닌 문자를 모두 제거하여 해결할 수 있다고 생각합니다.
trinity420

0

스트림 버전, 공간 및 탭을 필터링합니다.

Stream.of(str.split("[ \\t]")).filter(s -> s.length() > 0).collect(Collectors.joining(" "))

0
String myText = "   Hello     World   ";
myText = myText.trim().replace(/ +(?= )/g,'');


// Output: "Hello World"

0

문자열의 어느 곳에서나 공백을 제거하는 가장 간단한 방법입니다.

 public String removeWhiteSpaces(String returnString){
    returnString = returnString.trim().replaceAll("^ +| +$|( )+", " ");
    return returnString;
}

-1
public class RemoveExtraSpacesEfficient {

    public static void main(String[] args) {

        String s = "my    name is    mr    space ";

        char[] charArray = s.toCharArray();

        char prev = s.charAt(0);

        for (int i = 0; i < charArray.length; i++) {
            char cur = charArray[i];
            if (cur == ' ' && prev == ' ') {

            } else {
                System.out.print(cur);
            }
            prev = cur;
        }
    }
}

위의 솔루션은 Java 함수를 사용하지 않고 O (n)의 복잡성을 가진 알고리즘입니다.


-1

아래 코드를 사용하십시오

package com.myjava.string;

import java.util.StringTokenizer;

public class MyStrRemoveMultSpaces {

    public static void main(String a[]){

        String str = "String    With Multiple      Spaces";

        StringTokenizer st = new StringTokenizer(str, " ");

        StringBuffer sb = new StringBuffer();

        while(st.hasMoreElements()){
            sb.append(st.nextElement()).append(" ");
        }

        System.out.println(sb.toString().trim());
    }
}

-1

늦어서 죄송합니다. 다음은 가장 우수하고 효율적인 답변입니다.

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MyPatternReplace {

public String replaceWithPattern(String str,String replace){

    Pattern ptn = Pattern.compile("\\s+");
    Matcher mtch = ptn.matcher(str);
    return mtch.replaceAll(replace);
}

public static void main(String a[]){
    String str = "My    name    is  kingkon.  ";
    MyPatternReplace mpr = new MyPatternReplace();
    System.out.println(mpr.replaceWithPattern(str, " "));
}

따라서이 예의 결과는 다음과 같습니다. 내 이름은 kingkon입니다.

그러나이 방법은 문자열에있을 수있는 "\ n"도 제거합니다. 따라서 원하지 않는 경우이 간단한 방법을 사용하십시오.

while (str.contains("  ")){  //2 spaces
str = str.replace("  ", " "); //(2 spaces, 1 space) 
}

선행 및 후행 공백도 제거하려면 다음을 추가하십시오.

str = str.trim();

-1

replaceAll 메소드가 훨씬 쉽다는 것을 알고 있지만 이것을 게시하고 싶습니다.

public static String removeExtraSpace(String input) {
    input= input.trim();
    ArrayList <String> x= new ArrayList<>(Arrays.asList(input.split("")));
    for(int i=0; i<x.size()-1;i++) {
        if(x.get(i).equals(" ") && x.get(i+1).equals(" ")) { 
            x.remove(i); 
            i--; 
        }
    }
    String word="";
    for(String each: x) 
        word+=each;
    return word;
}

1
이것이 작동하더라도 가장 쉬운 해결책은 아닙니다.
platzhersh

-1

String Tokenizer를 사용할 수 있습니다

 String str = "  hello    there  ";
            StringTokenizer stknzr = new StringTokenizer(str, " ");
            StringBuffer sb = new StringBuffer();
            while(stknzr.hasMoreElements())
            {
                sb.append(stknzr.nextElement()).append(" ");
            }
            System.out.println(sb.toString().trim());
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.