Bagaimana cara memeriksa bahwa Java String tidak semua spasi putih?

132

Saya ingin memeriksa bahwa Java String atau array karakter tidak hanya terdiri dari spasi putih, menggunakan Java?

Ini adalah pertanyaan yang sangat mirip kecuali Javascript:
Bagaimana saya bisa memeriksa apakah string berisi karakter & spasi, bukan hanya spasi?

EDIT : Saya menghapus sedikit tentang karakter alfanumerik, jadi lebih masuk akal.

Ankur
sumber
3
Ketahuilah bahwa ada banyak definisi ruang kosong yang berbeda: spreadsheets.google.com/pub?key=pd8dAQyHbdewRsnE5x5GzKQ Apa yang Anda inginkan? Atau kemudian Anda mengatakan "memiliki karakter alfanumerik", yang merupakan hal yang sangat berbeda. Mohon klarifikasi.
Kevin Bourrillion
Permintaan maaf untuk kebingungan ... tidak semua spasi putih adalah kuncinya - pada dasarnya jika memiliki semua karakter spasi saya ingin mengecualikannya, karena tidak memiliki konten.
Ankur
1
Dengan JDK / 11 Anda dapat menggunakanString.isBlank API untuk hal yang sama.
Naman

Jawaban:

224

Solusi terpendek yang dapat saya pikirkan:

if (string.trim().length() > 0) ...

Ini hanya memeriksa ruang putih (non). Jika Anda ingin memeriksa kelas karakter tertentu, Anda harus menggunakan perkasa match()dengan regexp seperti:

if (string.matches(".*\\w.*")) ...

... yang memeriksa setidaknya satu karakter alfanumerik (ASCII).

Carl Smotricz
sumber
9
FWIW: Saya mengharapkan solusi pertama menjadi jauh lebih cepat.
Stephen C
2
@Stephen C: Benar-benar! Tetapi seperti yang ditunjukkan oleh @Uri, saya harus menyelesaikan dua masalah yang berbeda berkat ketidakjelasan pertanyaan :) Juga, saya jarang menggunakan matches(): untuk kinerja, saya biasanya menyimpan Patterndi a final static. Membayar jika kode yang sama sering berjalan.
Carl Smotricz
3
@Andreas_D: Heh, saya mendapat pesanan saya! OP mengatakan dia ingin memeriksa string atau array char, dia tidak pernah mengatakan apapun tentang nulls! :) * memeriksa cetakan kecil dalam kontrak * " nullbukan string!"
Carl Smotricz
1
Juga, "\\ w" hanya cocok dengan subset terbatas karakter non-spasi putih daripada semua non-spasi putih karena mengacu pada "karakter kata" yang didefinisikan sebagai AZ, az, 0-9, dan garis bawah.
Rob Raisch
2
Saya menggunakan your_string.trim (). IsEmpty () dan melakukan pekerjaan itu untuk saya
Neri
59

Saya akan menggunakan perpustakaan Apache Commons Lang. Ini memiliki kelas yang disebut StringUtils yang berguna untuk semua jenis operasi String. Untuk memeriksa apakah suatu String tidak semua spasi putih, Anda dapat menggunakan yang berikut ini:

StringUtils.isBlank(<your string>)

Berikut ini rujukannya: StringUtils.isBlank

Chris J
sumber
8
Saya lebih suka solusi ini dibandingkan dengan menggunakan jawaban yang dipilih. Ini juga akan memeriksa string == null
Richard
Ini sekarang salah. StringUtils.isEmptysekarang akan mengembalikan false jika Anda "" masuk.
James Spence
53

Sedikit lebih pendek dari apa yang disebutkan oleh Carl Smotricz:

!string.trim().isEmpty();
redslime
sumber
10
Anda pembuat whippingnappers muda dan tipu daya pasca-Jawa-1.6 baru Anda! Serius, setidaknya satu proyek di perusahaan saya masih berjalan di Java 1.4 (menghela napas).
Carl Smotricz
Singkat? Iya. Secara pribadi, saya suka gaya pengkodean yang lebih verbose
Michel
9

Jika Anda menggunakan Java 11 , isBlankmetode string baru akan berguna:

!s.isBlank();

Jika Anda menggunakan Java 8, 9 atau 10 , Anda bisa membangun aliran sederhana untuk memeriksa bahwa string bukan hanya spasi kosong:

!s.chars().allMatch(Character::isWhitespace));

Selain tidak memerlukan pustaka pihak ketiga seperti Apache Commons Lang, solusi ini memiliki keuntungan menangani karakter spasi putih, dan tidak hanya ' 'ruang kosong seperti trimsolusi berbasis yang disarankan dalam banyak jawaban lain. Anda dapat merujuk ke Javadocs untuk daftar lengkap semua jenis ruang putih yang didukung. Perhatikan bahwa string kosong juga tercakup dalam kedua kasus.

Pyves
sumber
5
if(target.matches("\\S")) 
    // then string contains at least one non-whitespace character

Perhatikan penggunaan back-slash cap-S, yang berarti "char non-whitespace"

Saya berani bertaruh ini adalah solusi paling sederhana (dan mungkin yang tercepat?).

Rob Raisch
sumber
2
Mari kita coba: String year="1995"; year.matches("\\S"); will return falseJadi ini bukan solusi yang tepat. : |
Nhat Dinh
6
Nhat, kamu benar meskipun aku bingung menjelaskan mengapa. Menurut dokumen Java, String.matches memeriksa untuk melihat apakah string yang diberikan cocok dengan regex. Sebuah eksperimen kecil menunjukkan bahwa ini tidak sepenuhnya akurat, karena fungsi ini tampaknya cocok HANYA jika regex yang disediakan cocok dengan string SELURUH! Jadi, mengubah regex di atas ("\\ S") menjadi "^. * \\ S. * $" Akan berfungsi seperti yang diharapkan, meskipun perilaku ini tidak didokumentasikan dengan benar dan tampaknya berbeda secara substansial dari setiap implementasi pencocokan string lainnya. menggunakan Ekspresi Reguler.
Rob Raisch
4

Jawaban ini lebih berfokus pada sidenote " yaitu memiliki setidaknya satu karakter alfanumerik ". Selain itu, itu tidak menambahkan terlalu banyak ke solusi (sebelumnya) yang lain, kecuali bahwa itu tidak menyakiti Anda dengan NPE jika Stringnull .

Kami ingin falsejika (1) s adalah nullatau (2) s kosong atau (3) hanya berisi whitechars.

public static boolean containsNonWhitespaceChar(String s) {
  return !((s == null) || "".equals(s.trim()));
}
Andreas Dolk
sumber
4

Jika Anda hanya memeriksa spasi putih dan tidak peduli dengan null maka Anda dapat menggunakan org.apache.commons.lang.StringUtils.isWhitespace (String str),

StringUtils.isWhitespace(String str);

(Memeriksa apakah String hanya berisi spasi putih.)

Jika Anda juga ingin memeriksa null (termasuk spasi) maka

StringUtils.isBlank(String str);
Arun
sumber
isBlank (String) direkomendasikan karena ia juga menangani validasi nol!
Sachidananda Naik
2

Dengan Java-11 +, Anda dapat menggunakan String.isBlankAPI untuk memeriksa apakah string yang diberikan tidak semuanya terdiri dari spasi putih -

String str1 = "    ";
System.out.println(str1.isBlank()); // made up of all whitespaces, prints true

String str2 = "    a";
System.out.println(str2.isBlank()); // prints false

Javadoc untuk hal yang sama adalah:

/**
 * Returns {@code true} if the string is empty or contains only
 * {@link Character#isWhitespace(int) white space} codepoints,
 * otherwise {@code false}.
 *
 * @return {@code true} if the string is empty or contains only
 *         {@link Character#isWhitespace(int) white space} codepoints,
 *         otherwise {@code false}
 *
 * @since 11
 */
public boolean isBlank()
Naman
sumber
1

Metode langsing akan bekerja bagus untuk Anda.

http://download.oracle.com/docs/cd/E17476_01/javase/1.4.2/docs/api/java/lang/String.html#trim ()

Mengembalikan salinan string, dengan spasi whitespace memimpin dan tertinggal dihilangkan. Jika objek String ini mewakili urutan karakter kosong, atau karakter pertama dan terakhir dari urutan karakter yang diwakili oleh objek String ini keduanya memiliki kode lebih besar dari '\ u0020' (karakter spasi), maka referensi ke objek String ini dikembalikan.

Jika tidak, jika tidak ada karakter dengan kode lebih besar dari '\ u0020' dalam string, maka objek String baru yang mewakili string kosong dibuat dan dikembalikan.

Jika tidak, biarkan k menjadi indeks karakter pertama dalam string yang kodenya lebih besar dari '\ u0020', dan biarkan m menjadi indeks karakter terakhir dalam string yang kodenya lebih besar dari '\ u0020'. Objek String baru dibuat, mewakili substring dari string ini yang dimulai dengan karakter pada indeks k dan berakhir dengan karakter pada indeks m-yaitu, hasil dari substring ini (k, m + 1).

Metode ini dapat digunakan untuk memotong spasi putih dari awal dan akhir string; pada kenyataannya, ini memangkas semua karakter kontrol ASCII juga.

Pengembalian: Salinan string ini dengan spasi putih awal dan akhir dihapus, atau string ini jika tidak memiliki spasi putih awal atau tertinggal.

Anda bisa memotong dan kemudian membandingkannya dengan string kosong atau mungkin memeriksa panjangnya 0.

Corey Ogburn
sumber
Tautan dalam jawaban sudah mati - 404 | Maaf, halaman tidak ada atau tidak lagi tersedia .
Pang
0

Alternatif:

boolean isWhiteSpaces( String s ) {
    return s != null && s.matches("\\s+");
 }
OscarRyz
sumber
1
\\ s * akan cocok dengan semua string dengan atau tanpa spasi putih. Mungkin maksud Anda +?
Rob Raisch
0

trim () dan ekspresi reguler yang disebutkan lainnya tidak berfungsi untuk semua jenis spasi putih

yaitu: Karakter Unicode 'LINE SEPARATOR' http://www.fileformat.info/info/unicode/char/2028/index.htm

Fungsi Java Character.isWhitespace () mencakup semua situasi.

Itu sebabnya solusi yang sudah disebutkan StringUtils.isWhitespace (String) / atau StringUtils.isBlank (String) harus digunakan.

andreyro
sumber
0

Hanya perbandingan kinerja pada openjdk 13, Windows 10. Untuk masing-masing teks berikut:

"abcd"
"    "
" \r\n\t"
" ab "
" \n\n\r\t   \n\r\t\t\t   \r\n\r\n\r\t \t\t\t\r\n\n"
"lorem ipsum dolor sit amet  consectetur adipisici elit"
"1234657891234567891324569871234567891326987132654798"

dieksekusi salah satu dari tes berikut:

// trim + empty
input.trim().isEmpty()

// simple match
input.matches("\\S")

// match with precompiled pattern
final Pattern PATTERN = Pattern.compile("\\S");
PATTERN.matcher(input).matches()

// java 11's isBlank
input.isBlank()

masing-masing 10.000.000 kali.

Hasil:

METHOD    min   max   note
trim:      18   313   much slower if text not trimmed
match:   1799  2010   
pattern:  571   662   
isBlank:   60   338   faster the earlier hits the first non-whitespace character

Cukup mengejutkan trim + kosong adalah yang tercepat. Bahkan jika perlu membangun teks yang dipangkas. Masih lebih cepat dari loop sederhana, mencari satu karakter non-spasi putih ...

EDIT: Semakin panjang teks, semakin banyak angka yang berbeda. Trim teks panjang membutuhkan waktu lebih lama daripada hanya loop sederhana. Namun, regex masih merupakan solusi paling lambat.

martlin
sumber
0

Meskipun secara pribadi saya lebih suka !str.isBlank(), seperti yang telah disarankan orang lain (atau str -> !str.isBlank()sebagai Predikat), versi yang lebih modern dan efisien dari str.trim()pendekatan yang disebutkan di atas, akan menggunakan str.strip()- menganggap nulls sebagai "spasi putih":

if (str != null && str.strip().length() > 0) {...}

Misalnya sebagai Predikat, untuk digunakan dengan stream, misalnya dalam uji unit:

@Test
public void anyNonEmptyStrippedTest() {
    String[] strings = null;
    Predicate<String> isNonEmptyStripped = str -> str != null && str.strip().length() > 0;
    assertTrue(Optional.ofNullable(strings).map(arr -> Stream.of(arr).noneMatch(isNonEmptyStripped)).orElse(true));
    strings = new String[] { null, "", " ", "\\n", "\\t", "\\r" };
    assertTrue(Optional.ofNullable(strings).map(arr -> Stream.of(arr).anyMatch(isNonEmptyStripped)).orElse(true));
    strings = new String[] { null, "", " ", "\\n", "\\t", "\\r", "test" };
}
fozzybear
sumber