Ini teks saya:

hello foo-1 hello bar $4 hello ...

Saya perlu menemukan semua yang cocok dengan /hello .*/:

["hello foo-1", "hello bar $4", ...]

Apa ekspresi reguler untuk diumpankan ke scan() untuk mencapai ini?

2
yegor256 16 Maret 2017, 13:30

2 jawaban

Jawaban Terbaik

Gunakan split dengan regex berbasis lookahead:

'hello foo-1 hello bar $4 hello'.split(/(?=hello)/)

Lookahead positif (?=hello) akan membagi string pada posisi di depan setiap hello dalam string.

Jika Anda perlu menghilangkan spasi putih (jika ada) tambahkan \s* di awal pola:

.split(/\s*(?=hello)/)

Lihat Demo Rubular dan demo kode Ruby online.

3
Wiktor Stribiżew 16 Maret 2017, 10:34

Inilah alternatif tanpa regexp. Ini menggunakan slice_before :

"hello foo-1 hello bar $4 hello".split.slice_before("hello").map{|words| words.join(' ')}
# => ["hello foo-1", "hello bar $4", "hello"]
"hello helloween hello halloween".split.slice_before("hello").map{|words| words.join(' ')}
# => ["hello helloween", "hello halloween"]
0
Eric Duminil 16 Maret 2017, 15:42