रूबी% r {} अभिव्यक्ति


131

एक मॉडल में एक क्षेत्र है

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

यह मेरे लिए बहुत अजीब लगता है। मुझे पता है कि यह एक नियमित अभिव्यक्ति है। लेकिन मैं चाहूँगा:

  • यह जानने के लिए कि वास्तव में इसका क्या मतलब है। के %r{value}बराबर है /value/?
  • इसे सामान्य रूबी रेगेक्स ऑपरेटर के साथ बदलने में सक्षम हो /some regex/या ~=। क्या यह संभव है?

जवाबों:


254

%r{}/.../संकेतन के समतुल्य है, लेकिन आपको उनके बचने के बिना अपने regexp में '/' करने की अनुमति देता है:

%r{/home/user}

के बराबर है:

/\/home\/user/

यह केवल एक सिंटैक्स कमोडिटी है, सुगमता के लिए।

संपादित करें:

ध्यान दें कि आप '{}' के बजाय लगभग किसी भी गैर-अक्षर वर्ण जोड़ी का उपयोग कर सकते हैं। ये वेरिएंट बस के रूप में अच्छी तरह से काम करते हैं:

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

2 संपादित करें:

ध्यान दें कि %r{}xवैरिएंट व्हाट्सएप को नजरअंदाज करता है, जिससे जटिल रीजैक्स अधिक पठनीय बन जाता है। GitHub की रूबी शैली गाइड से उदाहरण :

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

5
डाउनवोट 1 घंटे पहले ही था। सीमांकक के रूप में अंतरिक्ष के लिए, यह भयानक है, लेकिन इस तरह की चीज नहीं है जो मैं सिफारिश करूँगा कि आप छह महीने बाद बिना मधुमक्खी के आपके कोड को पढ़ने में सक्षम होंगे :)
यूरेका

3
यदि आप रिक्त स्थान को अपने सीमांकक के रूप में उपयोग करते हैं, तो यदि आप बाद में इसमें स्थान जोड़ते हैं तो आपकी नियमित अभिव्यक्ति टूट जाएगी। मुझे लगता है कि इस विचार का उपयोग उन सीमांतकों का उपयोग करना है जो आपकी नियमित अभिव्यक्ति में कुछ भी मेल नहीं खाते हैं, पसंदीदा डिफ़ॉल्ट के रूप में घुंघराले ब्रेसिज़ के साथ।
स्टीवन हिरलस्टन

1
यह लगभग वैसा ही है जैसे कि रूबी को यथासंभव भयानक कोड लिखने के लिए डिज़ाइन किया गया था
रोमन

अपने दूसरे संपादन के नोट को न समझें। क्या खास बात है %r{}x? /.../xव्हाट्सएप को भी नजरअंदाज करता है। यह %rवाक्य रचना का कोई विशेष गुण नहीं है । सभी विकल्प जो अनुसरण /../कर सकते हैं, वे भी अनुसरण कर सकते हैं %r{}
मेक्की

9

\.=> में एक बिंदु होता है
(gif|jpg|jpeg|png)=> फिर, इनमें से कोई एक एक्सटेंशन
$=> अंत, इसके बाद कुछ भी नहीं
i=> मामला असंवेदनशील

और यह लेखन जैसा ही है /\.(gif|jpg|jpeg|png)$/i


क्या% r {मान} / मान / के बराबर है?
अलेक्जेंड्रे

हाँ, यह वही है। - जैसा उदाहरण के लिए %w[1 2 3]वैसा ही है [1, 2, 3]
सामी डिंडाने

6
%w[1 2 3]के रूप में ही नहीं है [1, 2, 3]। यह वैसा ही है ['1', '2', '3']
जॉर्ग डब्ल्यू मित्तग सेप

@ JörgWMittag सुधार के लिए धन्यवाद।
समी डिंडाने

9

के साथ %r, आप किसी भी सीमांकक का उपयोग कर सकते हैं।

आप का उपयोग %r{}कर सकते हैं या %r[]या %r!!आदि

अन्य delimeters का उपयोग करने का लाभ यह है कि आपको /सामान्य रेगेक्स शाब्दिक रूप से उपयोग से बचने की आवश्यकता नहीं है ।


3

यह regexp सभी तार से मेल खाता है जो .gif, .jpg के साथ समाप्त होता है ...

आप इसे बदल सकते हैं

/\.(gif|jpg|jpeg|png)$/i

1

इसका मतलब है कि डॉट और एक gif, jpg, jpeg या png के साथ image_file_nameसमाप्त होना चाहिए $

हां का %r{}मतलब बिल्कुल वैसा ही है //लेकिन इसमें %r{}आपको भागने की जरूरत नहीं है /

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.