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スペース、タブ、改行、キャリッジリターン、フォームフィード、または垂直タブに一致し、+「それらの1つ以上」と言います。したがって、上記のコードは、1つの空白文字で、1文字より長いすべての「空白部分文字列」を折りたたみます。


ソース:Java:文字列内の重複する空白を削除する


3
@SuhrobSamiev-String.replaceAll()は、JDK 1.4以降、Javaで使用されています。docs.oracle.com/javase/1.4.2/docs/api/java/lang/...、java.lang.Stringで)
デヴィッド・モグラ

3
\ s +のすばらしい説明のために+1以上を追加できればいいのにと思います。
シンテック

わかりました\s+が、2つのバックスラッシュ\\はどういう意味ですか?
saplingPro 2012

2
文字列リテラル"\\"は、単一のバックスラッシュで構成される文字列を表します。だから\s+あなたを表すために書く"\\s+"
aioobe 2012

1
これで改行はなくなりますか?または、「\\ r」を個別に削除する必要がありますか?ありがとう!
user3388884 2014

24

あなたは正規表現を使うことができます

(\s)\1

そして

に置き換えてください$1

Javaコード:

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

入力の場合、出力として"foo\t\tbar "取得さ"foo\tbar "れますが
、入力の場合、"foo\t bar"連続する空白文字がないため、入力は変更されません。

すべての空白文字(スペース、垂直タブ、水平タブ、キャリッジリターン、フォームフィード、改行)をスペースとして扱う場合は、次の正規表現を使用して、任意の数の連続する空白を1つのスペースに置き換えることができます。

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

ただし、連続する2つの空白を1つのスペースに置き換える場合は、次のようにします。

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

これは正規表現とは逆にAndroidでかなり高速に実行されています


1
スペースでのみ機能し、タブや改行などの他の空白文字では機能しません。
パン2013

1
私は知っています、他のエンティティに対してこれらのwhileループをさらに追加する必要があります。しかし、このコードはこれらの正規表現としてアンドロイドではるかに速く実行され、私は完全な電子ブックを処理する必要がありました。
wutzebaer 2013

デスクトップでも非常に高速です。大きな文字列についてはテストしていませんが、多くの小さな文字列で実行する場合は、これがあなたが探している答えです。
2018

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

6

手遅れですが、同じタイプの連続するすべての空白をそのタイプの1つの空白に置き換えるより良い解決策(私にとってはうまくいく)を見つけました。あれは:

   Hello!\n\n\nMy    World  

になります

 Hello!\nMy World 

まだ前後に空白があることに注意してください。だから私の完全な解決策は:

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

ここでtrim()は、先頭と末尾のすべての空白文字列を "" に置き換えます。グループ#1の(\\s)キャプチャ\\s(つまり、 ''、 '\ n'、 '\ t'などの空白)です。記号は、1つ以上の先行トークンに一致するためのものです。したがって、単一の空白文字(「」、「\ 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 Tokeniserを使用することもできます。簡単な方法は、

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

-10

これは次の3つのステップで可能です。

  1. 文字列を文字配列(ToCharArray)に変換します
  2. 文字配列にループを適用
  3. 次に、文字列置換関数を適用します(Replace( "置換したい文字列"、 "元の文字列"));

1
これは良い解決策ではありません。char配列にドロップしても何も解決されません。問題の核心である置換の方法を実際に説明しているわけではありません。また、完全に無関係なリンクを投稿しないでください。そうする場合、スパマーとしてフラグが付けられます。
マット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.