นิพจน์ทั่วไปของ Ruby มีตัวดำเนินการที่ไม่ตรงกันเช่น“! ~” ใน Perl หรือไม่


92

ฉันแค่อยากรู้ว่า ruby ​​regex มี not match operator เหมือนกับ!~ใน perl หรือไม่ ฉันรู้สึกว่ามันไม่สะดวกที่จะใช้(?!xxx)หรือ(?<!xxxx)เพราะคุณไม่สามารถใช้รูปแบบนิพจน์ทั่วไปในxxxส่วนนี้ได้


8
สิ่งที่คุณต้องทำคือจุดไฟirbและลองทำ อาจจะเร็วกว่าการโพสต์คำถาม SO
Mark Thomas

33
แต่ไม่เร็วไปกว่า googling 'ruby not match' และค้นหาคำตอบนี้ใน SO;)
micapam

3
ฉันทดลองสักพักก่อนที่จะติดขัด googling และหาคำตอบนี้ (ซึ่งได้ผล) อย่าทิ้งใครสักคนเพื่อถามคำถาม
Jonathon Nordquist

2
เขาเขียนมันในแง่ดี สิ่งที่ฉันคิดว่าเขาตั้งใจจะพูดคือ "จำไว้ว่าคุณสามารถเริ่มต้นirbและลองทำดูอาจเร็วกว่าแม้กระทั่งโพสต์คำถาม SO และเป็นโอกาสที่ดีในการทดสอบสิ่งต่างๆโดยทั่วไป" นั่นคือสิ่งที่ฉันได้ยินอยู่แล้ว
user2066657

คำตอบ:


158

ใช่: ใช้!~งานได้ดี - คุณอาจคิดว่ามันไม่ได้เป็นเพราะมันหายไปจากหน้าเอกสารของRegexp . อย่างไรก็ตามมันใช้งานได้:

irb(main):001:0> 'x' !~ /x/
=> false
irb(main):002:0> 'x' !~ /y/
=> true

9
!~เป็นเอกสารภายใต้วัตถุ
Tonči D.

4
ด้วย Ruby 2.4 นอกจากนี้ยังมีไวยากรณ์ที่ค่อนข้างดีกว่าRegExp#match?ซึ่งคุณสามารถลบล้างได้อย่างง่ายดาย ตามบันทึกประจำรุ่นมันมีการจัดสรรน้อยกว่า!~
panmari

6

รองรับ AFAIK (?! xxx):

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

เป็นโซลูชันระดับล่าง การแปลงนิพจน์ทั่วไปด้วยวิธีนี้ไม่ใช่เรื่องง่ายเสมอไป ในทางกลับกันโซลูชันนี้ไม่ได้ขึ้นอยู่กับภาษาโปรแกรมระดับบนสุด;)
Konstantin

0

ย้อนกลับไปใน perl 'foobar' !~ /bar/เป็นเรื่องที่น่ากลัวอย่างยิ่งที่จะทดสอบว่าสตริงไม่มี "bar"

ใน Ruby โดยเฉพาะอย่างยิ่งกับคำแนะนำสไตล์สมัยใหม่ฉันคิดว่าโซลูชันที่ชัดเจนกว่านั้นเป็นแบบธรรมดาและเข้าใจง่ายกว่า:

input = 'foobar'

do_something unless input.match?(/bar/) 

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

ที่กล่าวว่าฉันคิดว่ามันจะน่ากลัวถ้ามี.no_match?วิธี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.