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.


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

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

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.

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.