Java kullanarak dizede yinelenen beyaz alanlar nasıl kaldırılır?


147

Java kullanarak bir dizede yinelenen beyaz boşluklar (sekmeler, yeni satırlar, boşluklar vb. Dahil) nasıl kaldırılır?

Yanıtlar:


378

Bunun gibi:

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

Örneğin

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

çıktılar

lorem ipsum dolor sit.

Bu ne anlama \s+geliyor?

\s+düzenli bir ifadedir. \sboşluk, sekme, yeni satır, satır başı, form feed'i veya dikey sekme ile eşleşir ve +"bunlardan biri veya daha fazlası" der. Böylece, yukarıdaki kod tek bir boşluk karakteri ile tüm "boşluk alt dizelerini" bir karakterden daha uzun bir şekilde daraltır.


Kaynak: Java: Dizelerde yinelenen beyaz boşlukları kaldırma


3
@SuhrobSamiev - String.replaceAll (), JDK 1.4'ten beri Java'dadır. docs.oracle.com/javase/1.4.2/docs/api/java/lang/… , java.lang.String)
David Moles

3
Keşke \ s + 'nın harika açıklaması için +1'den fazla ekleyebilseydim.
Cyntech

Anladım \s+ama 2 ters eğik çizgi \\ ne anlama geliyor?
saplingPro

2
Dize değişmez "\\"değeri, tek bir ters eğik çizgiden oluşan dizeyi temsil eder. Yani temsil etmek \s+için yaz "\\s+".
aioobe

1
Bu satırbaşı kaldıracak mı? ya da ayrı ayrı "\\ r" kaldırmak zorunda mıyım? Teşekkürler!
user3388884

24

Normal ifadeyi kullanabilirsiniz

(\s)\1

ve

ile değiştirin $1.

Java kodu:

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

Girdi çıktı olarak "foo\t\tbar "elde edilecekse Ancak girdi ardışık boşluk karakterleri olmadığı için girdi değişmeden kalacaktır."foo\tbar "
"foo\t bar"

Tüm boşluk karakterlerini (boşluk, dikey sekme, yatay sekme, satır başı, form beslemesi, yeni satır) boşluk olarak görürseniz, ardışık herhangi bir sayıda beyaz alanı tek bir boşlukla değiştirmek için aşağıdaki normal ifadeyi kullanabilirsiniz :

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

Ancak iki ardışık beyaz boşluğu tek bir boşlukla değiştirmek istiyorsanız yapmanız gerekir:

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

9

Bunu deneyin - import java.util.regex.*;

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

stringYinelenen beyaz boşlukları kaldırmanız gereken dizeniz nerede


9

merhaba bulduğum en hızlı (ama en güzel yol değil)

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

Bu bir regex ters android oldukça hızlı çalışıyor


1
Yalnızca boşluklar için çalışır, ancak sekmeler ve yeni satırlar gibi diğer boşluklar için çalışmaz.
Pang

1
biliyorum, diğer varlıklar için döngüler süre bunlardan daha eklemek zorunda. Ama bu kod android bu regex gibi çok daha hızlı çalıştırmak, tam e-kitaplar işlemek zorunda kaldı.
wutzebaer

Masaüstünde de çok daha hızlı. Büyük bir dize için test etmedim, ama çok sayıda küçük dizede çalıştırmayı planlıyorsanız, aradığınız cevap budur.
Ivelate

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

6

Çok geç olmasına rağmen, aynı ardışık tüm beyaz boşlukları kendi türünde bir beyaz boşluk ile değiştirecek daha iyi bir çözüm buldum (benim için işe yarıyor). Yani:

   Hello!\n\n\nMy    World  

olacak

 Hello!\nMy World 

Hala önde ve arkada beyaz boşluklar olduğuna dikkat edin. Benim tam çözümüm:

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

Burada, trim()tüm önde gelen ve arkadaki boşluk dizelerini "" ile değiştirir. grup 1'de ( '', '\ n', '\ t' gibi beyaz boşluklar) (\\s)yakalamak içindir . işareti, 1 veya daha fazla önceki simgeyi eşleştirmek içindir. Bu nedenle , herhangi bir beyaz boşluk karakteri ('', '\ n' veya '\ t') arasında ardışık karakterler (1 veya daha fazla) olabilir. eşleşen dizeleri eşleşen tipte (yalnızca 1 beyaz boşluk karakteri içeren) grup 1 dizesiyle (eşleşen tek beyaz boşluk karakteri) değiştirmek içindir. Yukarıdaki çözüm şu şekilde değişecektir:\\s+(\\s)+$1

   Hello!\n\n\nMy    World  

olacak

Hello!\nMy World

Yukarıdaki çözümümü burada bulamadım, bu yüzden gönderdim.


0

Tüm önde gelen ve sondaki yabancı boşluklardan kurtulmak istiyorsanız, böyle bir şey yapmak istersiniz:

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

Ardından, burada listelenen diğer stratejileri kullanarak kopyaları kaldırabilirsiniz:

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

0

Ayrıca herhangi bir alan, sekme, yeni satır ve tümü için Dize Simgesi'ni kullanmayı deneyebilirsiniz. Basit bir yol,

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

-10

Bu üç adımda mümkün olabilir:

  1. Dizeyi karakter dizisine dönüştür (ToCharArray)
  2. Karakter dizisinde döngü için başvur
  3. Sonra string replace işlevini uygulayın (Replace ("değiştirmek istediğiniz acı", "orijinal dize"));

1
Bu iyi bir çözüm değil, bir char dizisine bırakmak hiçbir şeyi çözmez. Aslında sorunun temelini oluşturan değiştirmenin nasıl yapılacağını açıklamıyorsunuz. Ayrıca lütfen yok tamamen ilgisiz bağlantılar yayınlayabilir. Bunu yaparsanız spam gönderen olarak işaretlenirsiniz.
Mat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.