Ekspresi reguler: temukan spasi (tab / spasi) tetapi bukan baris baru


97

Bagaimana saya bisa memiliki ekspresi reguler yang menguji spasi atau tab tetapi tidak untuk baris baru. Saya mencoba \stetapi ternyata tes untuk baris baru juga.

Saya menggunakan C # / WPF tetapi tidak masalah.

Jawaban:


190

Gunakan kelas karakter: [ \t]


1
Tepat untuk masalah saya. Lihat juga stackoverflow.com/a/25956935/292060 untuk \hkelas karakter khusus perl , tetapi ini menunjukkan ada banyak karakter spasi putih lainnya, jika Anda perlu menambahkannya ke daftar di sini.
goodeye

3
kenapa harus ada spasi sebelumnya \t?
Ooker

4
@Ooker Untuk menangkap ruang literal
codemonkee

Ini tidak akan cocok dengan jenis ruang lain, seperti yang telah disebutkan oleh jawaban lain.
Gus

1
Mengapa spasi sebelumnya \ t?
Catbuilts

35

Coba set karakter ini:

[ \t]

Ini hanya cocok dengan spasi atau tabulator.


14

Seperti yang dicatat oleh @ Eiríkr Útlendi, solusi yang diterima hanya mempertimbangkan dua karakter spasi: tab horizontal (U + 0009), dan spasi putus (U + 0020). Itu tidak mempertimbangkan karakter spasi putih lainnya seperti spasi non-breaking (yang kebetulan ada dalam teks yang saya coba tangani). Daftar karakter spasi kosong yang lebih lengkap disertakan di Wikipedia dan juga direferensikan dalam jawaban Perl terkait . Solusi C # sederhana yang memperhitungkan karakter lain ini dapat dibangun menggunakan pengurangan kelas karakter

[\s-[\r\n]]

atau, termasuk solusi Eiríkr Útlendi, Anda mengerti

[\s\u3000-[\r\n]]

3

Catatan: Untuk mereka yang berurusan dengan teks CJK (Cina, Jepang, dan Korea), spasi double-byte (Unicode \u3000) tidak disertakan dalam \simplementasi yang saya coba sejauh ini (Perl, .NET, PCRE, Python). Anda harus menormalkan string Anda terlebih dahulu (seperti mengganti semua \u3000dengan \u0020), atau Anda harus menggunakan kumpulan karakter yang menyertakan titik kode ini selain spasi kosong lain yang Anda targetkan, seperti [ \t\u3000].

Jika Anda menggunakan Perl atau PCRE, Anda memiliki opsi untuk menggunakan \hsingkatan untuk spasi horizontal , yang tampaknya menyertakan spasi byte tunggal, spasi byte ganda, dan tab, antara lain. Lihat thread Match whitespace tapi bukan newlines (Perl) untuk detail lebih lanjut.

Namun, \hsingkatan ini belum diterapkan untuk .NET dan C #, sebaik yang bisa saya katakan.


1
Poin yang bagus. Java \h(diperkenalkan di Java 8) memang termasuk \u3000, tetapi \stidak, kecuali Anda menyetel mode UNICODE_CHARACTER_CLASS (diperkenalkan di Java 7).
Alan Moore

0

Jika Anda ingin mengganti spasi di bawah kode bekerja untuk saya diC#

Regex.Replace(Line,"\\\s","");

Untuk Tab

Regex.Replace(Line,"\\\s\\\s","");

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.