นิพจน์ Ruby% r {}


135

ในโมเดลมีฟิลด์

validates :image_file_name, :format => { :with => %r{\.(gif|jpg|jpeg|png)$}i

มันดูแปลกสำหรับฉัน ฉันทราบว่านี่เป็นนิพจน์ทั่วไป แต่ฉันต้องการ:

  • เพื่อให้ทราบว่ามันหมายถึงอะไร คือ%r{value}เท่ากับ/value/?
  • สามารถแทนที่ด้วยตัวดำเนินการ Ruby regex ปกติ/some regex/หรือ~=. เป็นไปได้ไหม?

คำตอบ:


262

%r{}เทียบเท่ากับ/.../สัญกรณ์ แต่ช่วยให้คุณมี '/' ใน regexp ของคุณโดยไม่ต้องหลบหนี:

%r{/home/user}

เทียบเท่ากับ:

/\/home\/user/

นี่เป็นเพียงสินค้าทางไวยากรณ์เพื่อความชัดเจน

แก้ไข:

โปรดทราบว่าคุณสามารถใช้คู่อักขระที่ไม่ใช่ตัวอักษรเกือบทุกคู่แทน "{}" ได้ ตัวแปรเหล่านี้ทำงานได้เช่นกัน:

%r!/home/user!
%r'/home/user'
%r(/home/user)

แก้ไข 2:

โปรดทราบว่า%r{}xตัวแปรจะละเว้นช่องว่างทำให้ regexps ที่ซับซ้อนอ่านได้ง่ายขึ้น ตัวอย่างจากคู่มือสไตล์ Ruby ของ GitHub :

regexp = %r{
  start         # some text
  \s            # white space char
  (group)       # first group
  (?:alt1|alt2) # some alternation
  end
}x

5
การโหวตลดลงคือ 1 ชั่วโมงที่แล้วเท่านั้น สำหรับพื้นที่เป็นตัวคั่นสิ่งนี้ยอดเยี่ยม แต่ไม่ใช่สิ่งที่ฉันจะแนะนำเพื่อให้สามารถอ่านรหัสของคุณได้โดยไม่ต้องงงงวยในหกเดือนต่อมา :)
Eureka

3
หากคุณใช้ช่องว่างเป็นตัวคั่นนิพจน์ทั่วไปของคุณจะแตกหากคุณเพิ่มช่องว่างในภายหลัง ฉันคิดว่าแนวคิดคือการใช้ตัวคั่นที่ไม่ตรงกับสิ่งใดในนิพจน์ทั่วไปของคุณโดยมีวงเล็บปีกกาเป็นค่าเริ่มต้นที่ต้องการ
Steven Hirlston

1
เกือบจะเหมือนกับว่าทับทิมได้รับการออกแบบมาเพื่อเขียนโค้ดที่น่ากลัวที่สุด
Roman

ไม่เข้าใจบันทึกของการแก้ไขครั้งที่สองของคุณ พิเศษเกี่ยวกับ%r{}xอะไร? /.../xยังละเว้นช่องว่าง นี่ไม่ใช่คุณสมบัติพิเศษของ%rไวยากรณ์ ตัวเลือกทั้งหมดที่สามารถทำตามได้/../ก็สามารถทำตาม%r{}ได้เช่นกัน
Mecki

9

\.=> มีจุด
(gif|jpg|jpeg|png)=> จากนั้นหนึ่งในส่วนขยายเหล่านี้
$=> ส่วนท้ายไม่มีอะไรต่อจากนั้น
i=> ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่

/\.(gif|jpg|jpeg|png)$/iและมันก็เป็นเช่นเดียวกับการเขียน


% r {value} เท่ากับ / value / หรือไม่
Alexandre

ใช่มันเหมือนกัน - เช่น%w[1 2 3]เดียวกับ[1, 2, 3]ตัวอย่าง
Samy Dindane

7
%w[1 2 3]คือไม่ได้[1, 2, 3]เช่นเดียวกับ มันก็เหมือนกับ['1', '2', '3'].
Jörg W Mittag

@ JörgWMittagขอบคุณสำหรับการแก้ไข
Samy Dindane

9

ด้วย%rคุณสามารถใช้ตัวคั่นใดก็ได้

คุณสามารถใช้%r{}หรือ%r[]หรือ%r!!อื่น ๆ

ประโยชน์ของการใช้ตัวคั่นอื่น ๆ คือคุณไม่จำเป็นต้องหลีกเลี่ยงการ/ใช้ในตัวอักษร regex ปกติ



1

หมายความว่าimage_file_nameต้องลงท้าย ( $) ด้วย dot และหนึ่งใน gif, jpg, jpeg หรือ png

ใช่%r{}หมายความว่าเหมือนกับ//แต่คุณไม่จำเป็นต้องหลบหนี%r{}/

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