web-dev-qa-db-ja.com

Javaを使用して文字列の重複する空白を削除するにはどうすればよいですか?

Javaを使用して文字列から重複する空白(タブ、改行、スペースなどを含む)を削除するにはどうすればよいですか?

144
brainless

このような:

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

例えば

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

出力

lorem ipsum dolor sit.

\s+はどういう意味ですか?

\s+は正規表現です。 \sは、スペース、タブ、改行、キャリッジリターン、フォームフィード、または垂直タブに一致し、+は「これらの1つ以上」と言います。したがって、上記のコードは、1文字より長いすべての「空白部分文字列」を、単一のスペース文字で折りたたみます。


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

372
aioobe

正規表現を使用できます

(\s)\1

そして

$1に置き換えます。

Javaコード:

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

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

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

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

ただし、2つの連続した空白を単一のスペースに置き換える場合は、次のようにする必要があります。

str = str.replaceAll("\\s{2}"," ");
24
codaddict

こんにちは最速(しかし最もきれいな方法ではない)が見つかりました

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

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

9
wutzebaer

これを試してください-あなたはimport Java.util.regex.*;する必要があります

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

stringは、重複する空白を削除する必要がある文字列です

9
Sachin Shanbhag
String str = "   Text    with    multiple    spaces    ";
str = org.Apache.commons.lang3.StringUtils.normalizeSpace(str);
// str = "Text with multiple spaces"
8
oleg.cherednik

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

   Hello!\n\n\nMy    World  

なります

 Hello!\nMy World 

まだ先頭と末尾に空白があることに注意してください。私の完全なソリューションは次のとおりです。

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

ここで、trim()は、先頭と末尾のすべての空白文字列を ""に置き換えます。 (\\s)は、group#1\\s( ''、 '\ n'、 '\ t'などの空白)をキャプチャするためのものです。 +記号は、1つ以上の先行トークンを照合するためのものです。したがって、(\\s)+は、任意の単一の空白文字( ''、 '\ n'、または '\ t')の中の連続した文字(1つ以上)にすることができます。 $1は、一致する文字列をgroup#1文字列(1つの空白文字のみを含む)の一致するタイプ(一致した単一の空白文字)で置き換えるためのものです。上記のソリューションは次のように変更されます。

   Hello!\n\n\nMy    World  

なります

Hello!\nMy World

ここで上記の解決策を見つけていないので、投稿しました。

6
arnobpl

また、任意のスペース、タブ、改行、その他すべてにString Tokenizerを使用することもできます。簡単な方法は、

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

すべての先行および後続の無関係な空白を削除する場合は、次のような操作を行います。

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

次に、ここにリストされている他の戦略を使用して重複を削除できます。

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