Bagaimana mencari kemunculan lebih dari satu spasi antar kata dalam satu baris

109

Bagaimana mencari kemunculan lebih dari satu spasi antar kata dalam satu baris

1. this is a line containing  2 spaces
2. this is a line containing   3 spaces
3. this is a line containing multiple spaces first  second   three   four

Semua hal di atas adalah kecocokan valid untuk regex ini. Regex apa yang harus saya gunakan?

Sam
sumber
Apakah Anda mencoba memeriksa spasi kosong yang berurutan atau semua spasi di baris itu?
Sachin Shanbhag
spasi kosong berurutan tidak semua spasi
Sam
1
Apa sebenarnya yang Anda maksud dengan "di antara kata-kata"? Dalam dua contoh Anda, ada beberapa spasi antara kata dan digit. Bagaimana dengan tanda baca (misalnya, apakah Anda ingin mencocokkan beberapa spasi setelah titik dan sebelum kata berikutnya)? Bagaimana dengan spasi sebelum / sesudah karakter terakhir dalam satu baris? Apakah Anda ingin mencocokkan tab juga? Bagaimana dengan baris yang hanya terdiri dari spasi?
Tim Pietzcker
spasi antara "berisi dan 2", "berisi dan 3", "pertama dan kedua", "kedua dan tiga" ... Ya, saya ingin mencocokkan spasi setelah titik dan sebelum kata berikutnya.
Sam

Jawaban:

180
[ ]{2,}

SPACE (2 atau lebih)

Anda juga bisa memeriksanya sebelum dan sesudah spasi kata-kata mengikuti. (bukan spasi lain seperti tab atau baris baru)

\w[ ]{2,}\w

sama, tetapi Anda juga dapat memilih (menangkap) hanya spasi untuk tugas-tugas seperti penggantian

\w([ ]{2,})\w

atau lihat bahwa sebelum dan sesudah spasi ada apa saja, tidak hanya karakter kata (kecuali spasi)

[^\s]([ ]{2,})[^\s]
AlexanderMP
sumber
1
\wberarti 'karakter kata', yaitu alfanumerik dan garis bawah, tetapi bukan karakter bukan spasi lainnya. Untuk memeriksa non-spasi, gunakan \S(kapital S). Juga, yang pertama hanya akan cocok dengan baris yang berisi dua atau lebih spasi dan tidak ada yang lain.
tdammers
Saya mencoba mengembangkan pertanyaan. Saya mengerti bahwa saya melewatkan apa yang Anda katakan \S, saya hanya memilih untuk tidak mengandalkan kapitalisasi karakter untuk fungsionalitas seperti itu, lebih mudah dibaca.
AlexanderMP
1
Mengapa Anda menggunakan jangkar sama sekali? Dia mencari ruang yang tertanam di suatu tempat di garis.
Tim Pietzcker
tidak ada alasan khusus. Pada awalnya saya pikir saya membutuhkannya, jadi saya menyeret mereka sepanjang proses. Nyatanya, Anda benar bahwa saya salah karena menggunakannya dalam kasus ini. Saya akan segera mengedit jawaban saya.
AlexanderMP
1
\w[ ]{2,}\wakan gagal untuk mencocokkan word.<2 spaces>more wordsatau string yang seluruhnya terdiri dari spasi. [^\s]([ ]{2,})[^\s]\wakan gagal pada baris yang dimulai dengan spasi atau string seperti bla<2 spaces>....
Tim Pietzcker
12

Solusi sederhana:

/\s{2,}/

Ini cocok dengan semua kemunculan dari satu atau lebih karakter spasi. Jika Anda perlu mencocokkan seluruh baris, tetapi hanya jika berisi dua atau lebih karakter spasi kosong yang berurutan:

/^.*\s{2,}.*$/

Jika spasi putih tidak harus berurutan:

/^(.*\s.*){2,}$/
tdammers
sumber
the .*biasanya serakah, artinya itu akan mencapai akhir string yang diuji, dan semua yang mengikuti, jika ada karakter wajib, tidak akan cocok. Biasanya dalam hal ini adalah praktik yang baik untuk menambahkan ?, seperti ini .*?. Itu terjadi pada saya menggunakan PCRE PHP
AlexanderMP
Itu cocok. "Greedy" berarti mencocokkan sebanyak mungkin sambil tetap mencocokkan pola secara keseluruhan. /^.*b.*$/sebenarnya cocok "foobar", meskipun Anda sudah mengharapkan serakah pertama .*untuk mencocokkan seluruh string.
tdammers
9

Regex ini memilih semua spasi, Anda dapat menggunakan ini dan menggantinya dengan satu spasi

\s+

contoh di python

result = re.sub('\s+',' ', data))
Owen Yuwono
sumber
4

Cari [ ]{2,}. Ini akan menemukan dua atau lebih ruang yang berdekatan di manapun dalam garis. Ini juga akan mencocokkan spasi di depan dan di belakang serta garis yang seluruhnya terdiri dari spasi. Jika Anda tidak menginginkannya, lihat jawaban Alexander.

Sebenarnya, Anda dapat mengabaikan tanda kurung, ini hanya untuk kejelasan (jika tidak, karakter spasi yang diulang tidak terlalu terlihat :)).

Masalahnya \s{2,}adalah bahwa itu juga akan cocok dengan baris baru pada file Windows (di mana baris baru dilambangkan dengan CRLFatau \r\nyang dicocokkan dengan \s{2}.

Jika Anda juga ingin menemukan banyak tab dan spasi, gunakan [ \t]{2,}.

Tim Pietzcker
sumber
more than one space between words in a line. Bagaimana [ ]{2,}antar kata? Apakah Anda sudah membaca pertanyaannya?
AlexanderMP
Itulah sebabnya saya merujuk jawaban Anda seandainya OP benar-benar ingin seketat yang dia tulis. Mungkin kita harus bertanya padanya.
Tim Pietzcker
2

Inilah solusi saya

[^0-9A-Z,\n]

Ini akan menghapus semua digit, koma dan baris baru tetapi memilih ruang tengah seperti kumpulan data

  • 20171106,16632 ESCG0000018SB
  • 20171107.280 ESCG0000018SB
  • 20171106,70476 ESCG0000018SB
Ojitha
sumber