Javaで文字列内の2つ以上のスペースを単一のスペースに置き換え、先頭と末尾のスペースを削除する方法


271

この文字列を変更するJavaですばやく簡単な方法を探す

" hello     there   "

このようなものに

"hello there"

文字列の先頭にある1つ以上のスペースも削除したい場合を除いて、これらの複数のスペースをすべて1つのスペースに置き換えます。

このようなものは私をそこに部分的に連れて行きます

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

しかし、かなりではありません。


5
回答を受け入れることを検討する必要があります。これにより、後でページにアクセスする人が決定的なソリューションを選択するのがはるかに簡単になります。
Paul Rooney 2017

1
これは最も推奨される方法の1つです。=>。文字列nameWithProperSpacing = StringUtils.normalizeSpace(stringWithLotOfSpaces);
Kunal Vohra

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

回答:


461

これを試して:

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

こちらもご覧ください


trim()正規表現なし

これを1つだけで行うこともできます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空の文字列をキャプチャすると一致して置き換えます
  • (_)+ :上記のいずれにも一致しないスペースのシーケンス、つまり中央にある
    • $11つのスペースをキャプチャすると一致して置き換えます

こちらもご覧ください


11
それは価値がやっていることは注目です特にとして+1、trim()当時とはreplaceAll()、他の方法の周りにそれを行うよりも少ないメモリを使用しています。それほど多くはありませんが、これが何度も呼び出されると、特に「トリミング可能な空白」がたくさんある場合、合計される可能性があります。(Trim()余分なスペースは本当に取り除かれません-開始値と終了値を移動することで非表示にします。基になる値char[]は変更されません。)
corsiKa

2
それが唯一の詳細ですが、私はと思います( ) +( ){2,}(非常に)もう少し効率的でなければなりません。)
sp00m

6
いい正規表現。注:スペース ``を\\s置き換えると、空白のグループが目的の文字に置き換えられます。
djmj 2013

1
()+の部分は単一のスペースに一致し、単一のスペースに置き換えられることに注意してください。おそらく(<space> <space> +)の方が良いので、複数のスペースがある場合にのみ一致し、置換によって文字列が最終的に変更されます。
Lee Meador

2
Lee Meadorが述べたように、.trim().replaceAll(" +", " ")(2つのスペースがある場合)は.trim().replaceAll(" +", " ")(1つのスペースがある場合)よりも高速です。シングルスペースとダブルスペースしか含まれていない文字列に対してタイミングテストを実行したところ、多くの操作(環境によっては数百万以上)を実行するときに、どちらの場合もかなり高速になりました。
ゲーリーS.ウィーバー

154

あなたはただ必要です:

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

ここで、1つ以上のスペースを一致させ、それらを1つのスペースに置き換え、最初と最後で空白をトリミングします(実際に最初にトリミングしてから一致させることで反転させて、誰かが指摘したように正規表現を速くすることができます)。

これをすばやくテストするには、次のことを試してください。

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

そしてそれは戻ります:

"hello there"

3
正規表現を少し保存するので、おそらく最初にトリミングします。
マイケル

3
@ sarah.ferguson最初のreplaceAllに含めてはならない最後のブラケット ")"を削除してください。ありがとう。-システムは私にそれをさせません!(編集に適格な文字は6文字未満です。)
mwarren

2
複数のスペースが一緒にない場合、これは1つのスペースを別のスペースに置き換えます。この場合、1つのタブを1つのスペースに置き換えるため、置き換えを行う必要はありません。複数のスペースのみを認識するのが良いでしょう。
Lee Meador 2016

2
@geowar質問は申し訳ありませんがタブを求めましたか?私は上記のもそのことについてなどの記号☮代わるものではありません...とどちら✌...確信している
sarah.ferguson

2
ちょっと待って@geowarこれは単一のテーブルをスペースに置き換えます。私は試してみました
user1870400


20

これは私にとって完璧に機能しました: sValue = sValue.trim().replaceAll("\\s+", " ");


1
人々は私の答えを編集しました。オリジナルは:sValue = sValue.replaceAll( "\ s +"、 "").trim();
ドクター

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()メソッドを使用します。そして、あなたのを使用してください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

まず、すべてのスペースを1つのスペースに置き換えます。我々はトリム行うことになっている以外Stringの始動ためStringとの終わりStringならば、それは単一のスペースで、すべてのスペースに置き換えられますString開始時のスペースを持っているStringとの終わりString、我々はそれらをトリミングする必要がありますので。あなたが望むものを手に入れるよりString


4

ルックアラウンドも使用できます。

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

または

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

<space>(?= )別のスペース文字が後に続くスペース文字に一致します。したがって、連続するスペースでは、最後にスペース文字が続かないため、最後のスペースを除くすべてのスペースに一致します。これにより、削除操作後の連続したスペースに1つのスペースが残ります。

例:

    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()メソッド内のすべての内部スペースを反復処理します。おそらく、一度に2つ以上のスペースのシーケンスに一致するように変更して、内部反復を減らすことができます。
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 2016

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 +++++++ there +++を返すため、確実に機能しません
。–

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;
}

パターン .quote( "?")はリテラルパターンStringを返します。


0

より良い解決策として正規表現を使用して2番目の答えを見つける前の私の方法。多分誰かがこのコードを必要としています。

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 2016

@LaurIvanどういう意味ですか?
trinity420 2016年

このエントリは、\s正規表現の意味(スペース、タブ、改行、フォームフィード)について適切に説明しています。
Laur Ivan 2016

@LaurIvanあなたのリンクは壊れていますが、あなたは正しいです。この問題は、入力文字列を反復処理して、アルファベット以外、数字、スペース以外のすべての文字を削除することで解決できると思います。
trinity420 2016年

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.