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.