Cara memeriksa apakah suatu baris kosong menggunakan regex

154

Saya mencoba membuat regex sederhana yang akan memeriksa apakah suatu baris kosong atau tidak.

Kasus;

"    some"   // not blank
"   " //blank
"" // blank
Adnan
sumber
Di sini, Blank berarti apa yang Anda maksudkan. Baris berisi penuh spasi putih atau baris tidak mengandung apa pun. Jika Anda ingin mencocokkan garis yang tidak mengandung apa pun, gunakan '/ ^ $ /'
Badri Gs

Jawaban:

329

Pola yang Anda inginkan adalah sesuatu seperti ini dalam mode multiline:

^\s*$

Penjelasan:

  • ^ adalah awal dari anchor string.
  • $ adalah akhir dari jangkar tali.
  • \s adalah kelas karakter whitespace.
  • * adalah pengulangan nol atau lebih dari.

Dalam mode multiline, ^dan $juga cocok dengan awal dan akhir baris.

Referensi:


Alternatif non-regex:

Anda juga dapat memeriksa apakah string yang diberikan line"kosong" (yaitu hanya berisi spasi putih) dengan trim()-ing, kemudian memeriksa apakah string yang dihasilkan isEmpty().

Di Jawa, ini akan menjadi seperti ini:

if (line.trim().isEmpty()) {
    // line is "blank"
}

Solusi regex juga dapat disederhanakan tanpa jangkar (karena cara matchesdidefinisikan di Jawa) sebagai berikut:

if (line.matches("\\s*")) {
    // line is "blank"
}

Referensi API

polygenelubricants
sumber
1
@ Adnan: perhatikan komentar Bart dalam jawaban Marcelo; tergantung pada bagaimana Anda ingin menangani beberapa baris kosong, polanya mungkin sedikit berubah.
polygenelubricants
Yah saya membaca file dari Jawa, baris demi baris, jadi saya menganggap bahwa ini akan baik-baik saja.
Adnan
1
yang tampaknya brilian dengan line.trim: D
Adnan
1
luar biasa kode sekarang dijalankan dari 1.6sec ke> 1sec Terima kasih.
Adnan
dalam python: if line.strip(): karena sebuah string kosong dievaluasi menjadiFalse
John Mark
58

Sebenarnya dalam mode multiline jawaban yang lebih benar adalah ini:

/((\r\n|\n|\r)$)|(^(\r\n|\n|\r))|^\s*$/gm

Jawaban yang diterima: ^\s*$tidak cocok dengan skenario ketika baris terakhir kosong (dalam mode multiline).

bchr02
sumber
Tepat, dan saya mengkonfirmasi ini adalah masalahnya. Jawaban yang diterima melewatkan banyak baris kosong di file saya, tetapi ini menangkap semuanya. Persatuan kedua regex menangkap setiap kasus.
elmor
1
Jawaban ini bekerja dengan sempurna di alat seperti Notepad ++. Jawaban yang diterima cocok dengan beberapa baris kosong tetapi tidak satu baris kosong.
james
Dalam kasus saya, jawaban yang diterima tidak berfungsi di Sublime Text 3, dan ini berfungsi.
yangsibai
1
Jawaban yang diterima berhasil untuk kasus saya, multiline. Ini tidak.
Robert Gabriel
1
ini harus menjadi jawaban terbaik.
Q i
12

Coba ini:

^\s*$
Marcelo Cantos
sumber
5
@ Adnan, perhatikan bahwa \sjuga cocok dengan jeda baris, sehingga Anda tidak akan "menemukan" satu baris kosong di dalam string yang berisi baris kosong berturut-turut.
Bart Kiers
6

Regex yang paling portabel adalah ^[ \t\n]*$untuk mencocokkan string kosong (perhatikan bahwa Anda perlu mengganti \tdan \ndengan tab dan baris baru yang sesuai) dan [^ \n\t]untuk mencocokkan string non-spasi putih.

soulmerge
sumber
Setidaknya saya akan mengubah ruang tunggal dengan kelas[ \t]
Bart Kiers
1
Pada Windows Anda juga perlu mempertimbangkan karakter carriage return \rsehingga regex akan ^[ \t\r\n]*$. Tetapi ^\s*$lebih baik - lebih ringkas. Jika Anda tidak ingin mencocokkan baris baru, Anda dapat menggunakan \h(artinya spasi putih horisontal) seperti di^\h*$
ps.pf
5

Penghargaan penuh untuk bchr02 untuk jawaban ini . Namun, saya harus memodifikasinya sedikit untuk menangkap skenario untuk baris yang */(akhir komentar) diikuti oleh baris kosong. Regex cocok dengan garis tidak kosong */.

Baru: (^(\r\n|\n|\r)$)|(^(\r\n|\n|\r))|^\s*$/gm

Yang saya lakukan adalah menambahkan ^karakter kedua untuk menandakan dimulainya baris.

John Henry
sumber
Mengapa tidak mengomentari jawaban bchr02 dan menyarankan peningkatan pada jawabannya?
adamlogan
1
@adamlogan ya, dari memori, saya pikir saya ingin melakukannya pada saat itu, tetapi saya tidak memiliki reputasi yang cukup untuk mengomentari posting orang lain, jadi saya harus melakukannya seperti ini.
John Henry
3

Di sini, Blank berarti apa yang Anda maksudkan.
Baris berisi penuh spasi putih atau baris tidak mengandung apa pun.
Jika Anda ingin mencocokkan garis yang tidak mengandung apa pun, gunakan '/ ^ $ /'.

Kiruthika
sumber
-1

Yah ... Saya bermain-main (menggunakan notepadd ++) dan ini adalah solusi yang saya temukan

\ n \ s

\ n untuk akhir baris (di mana Anda mulai mencocokkan) - tanda sisipan tidak akan membantu dalam kasus saya karena awal baris adalah string memerlukan ruang hingga string berikutnya

semoga membantu

M_TRONIC
sumber
OP menginginkan jawaban regex, yang diberikan, dan bukan tentang karakter baris baru.
Moody_Mudskipper
pengguna meminta "regex sederhana yang akan memeriksa apakah suatu baris kosong" regex ini (diuji di regexpal.com) melakukan hal itu. mengapa kamu tidak mengujinya?
M_TRONIC
menggunakan R, vektor pengujian kami: test_vec <- c(" some"," ",""). solusi Anda: grepl("\\n\\s",test_vec) # [1] FALSE FALSE FALSE, yang sebagai solusi: grepl("^\\s*$",test_vec) # [1] FALSE TRUE TRUE. solusi yang dipilih memberikan hasil yang diharapkan, milik Anda tidak.
Moody_Mudskipper
seperti saya katakan saya menggunakan ini pada notepad ++ dan berhasil. milikmu tidak. jadi saya kira kita bisa setuju untuk tidak setuju!
M_TRONIC
Saya tidak begitu yakin apa yang Anda lakukan, apa yang Anda lakukan ctrl+fdi notepad ++? Dalam hal ini Anda dapat menemukan (meskipun tidak benar-benar cocok) baris kosong dengan memilih mode Pencarian "Extended" dan mencari '\ n \ s', jika Anda memilih "Ekspresi Reguler ', string Anda akan cocok dengan yang sama, dan Anda dapat juga coba solusi @polygenelubricants.Yang terakhir akan benar-benar cocok dengan garis, Anda dapat memeriksa dan melihat perbedaannya. Saya sarankan Anda mengedit jawaban Anda untuk lebih jelas tentang apa yang Anda sarankan, sehingga pembaca dapat mengambil lebih banyak nilai dari itu.
Moody_Mudskipper