Apakah ekspresi reguler Ruby memiliki operator yang tidak cocok seperti “! ~” Di Perl?

92

Saya hanya ingin tahu apakah ruby ​​regex memiliki operator not match seperti !~di perl. Saya merasa tidak nyaman untuk digunakan (?!xxx)atau (?<!xxxx)karena Anda tidak dapat menggunakan pola regex di xxxbagian tersebut.

pengguna1793091
sumber
8
Yang harus Anda lakukan hanyalah menyalakan irbdan mencobanya. Mungkin akan lebih cepat daripada memposting pertanyaan SO.
Mark Thomas
33
Tapi tidak lebih cepat dari googling 'ruby not match' dan menemukan jawaban ini di SO;)
micapam
3
Saya bereksperimen beberapa saat sebelum terjebak, mencari di Google dan menemukan jawaban ini (yang berhasil.). Jangan pernah menyerah pada seseorang untuk mengajukan pertanyaan.
Jonathon Nordquist
2
Dia mengutarakannya secara sub-optimal. Apa yang saya pikir ingin dia katakan adalah, "ingat Anda dapat memulai irbdan mencobanya. Mungkin lebih cepat, bahkan, daripada memposting pertanyaan SO, dan kesempatan besar untuk menguji hal-hal secara umum." Begitulah cara saya mendengarnya.
pengguna2066657

Jawaban:

158

Ya: !~berfungsi dengan baik - Anda mungkin mengira itu tidak akan terjadi karena hilang dari halaman dokumentasiRegexp . Namun demikian, ini berhasil:

irb(main):001:0> 'x' !~ /x/
=> false
irb(main):002:0> 'x' !~ /y/
=> true
Konrad Rudolph
sumber
9
!~didokumentasikan di bawah Objek .
Tonči D.
4
Dengan ruby ​​2.4, ada juga sintaks yang lebih bagus RegExp#match?, yang dapat Anda negasikan dengan mudah. Menurut catatan rilis , alokasi itu bahkan lebih sedikit daripada!~
panmari
6

AFAIK (?! Xxx) didukung:

2.1.5 :021 > 'abc1234' =~ /^abc/
 => 0
2.1.5 :022 > 'def1234' =~ /^abc/
 => nil
2.1.5 :023 > 'abc1234' =~ /^(?!abc)/
 => nil
2.1.5 :024 > 'def1234' =~ /^(?!abc)/
 => 0
betis
sumber
Ini adalah solusi tingkat rendah. Tidak selalu mudah untuk mengubah regexps dengan cara ini. Di sisi lain, solusi ini tidak bergantung pada bahasa pemrograman tingkat atas;)
Konstantin
0

Kembali ke perl, 'foobar' !~ /bar/sangat bahasa Inggris untuk menguji bahwa string tidak mengandung "bar".

Di Ruby, khususnya dengan panduan gaya modern, menurut saya solusi yang lebih eksplisit lebih konvensional dan mudah dipahami:

input = 'foobar'

do_something unless input.match?(/bar/) 

needs_bar = !input.match?(/bar/)

Yang mengatakan, saya pikir akan keren jika ada .no_match?metode.

David Hempy
sumber