सतह पर ऐसा लगता है कि किसी अन्य पैटर्न के अंदर एक पैटर्न एम्बेड करना बस काम करेगा, लेकिन यह रूबी में पैटर्न कैसे काम करता है, इसकी एक बुरी धारणा पर आधारित है, कि वे बस तार हैं। का उपयोग करना:
/foo/.class # => Regexp
ऐसे में यह वैकल्पिक यह बनाने के लिए इस्तेमाल झंडे की जानकारी है:
(/foo/ ).options # => 0
(/foo/i ).options # => 1
(/foo/x ).options # => 2
(/foo/ix ).options # => 3
(/foo/m ).options # => 4
(/foo/im ).options # => 5
(/foo/mx ).options # => 6
(/foo/imx).options # => 7
या, यदि आप द्विआधारी की तरह:
foo_regex = /foo/
एक RegExp ऑब्जेक्ट बनाता है
'%04b' % (/foo/ ).options # => "0000"
'%04b' % (/foo/i ).options # => "0001"
'%04b' % (/foo/x ).options # => "0010"
'%04b' % (/foo/xi ).options # => "0011"
'%04b' % (/foo/m ).options # => "0100"
'%04b' % (/foo/mi ).options # => "0101"
'%04b' % (/foo/mx ).options # => "0110"
'%04b' % (/foo/mxi).options # => "0111"
और याद करता है जब भी Regexp का उपयोग किया जाता है, चाहे एक स्टैंडअलोन पैटर्न या किसी अन्य में एम्बेडेड हो।
आप कार्रवाई में देख सकते हैं अगर हम पैटर्न embedding के बाद कैसा दिखता है देखने के लिए लग रही है:
/#{ /foo/ }/ # => /(?-mix:foo)/
/#{ /foo/i }/ # => /(?i-mx:foo)/
?-mix:
और ?i-mx:
कैसे उन विकल्पों एक एम्बेडेड पैटर्न में प्रतिनिधित्व कर रहे हैं कर रहे हैं।
Options के लिए Regexp प्रलेखन के अनुसार
:
i
, m
, और x
भी साथ उपसूचक स्तर पर लागू किया जा सकता (चालू-बंद?) निर्माण है, जो विकल्प पर सक्षम बनाता है , और कोष्ठक द्वारा संलग्न अभिव्यक्ति के लिए से विकल्प अक्षम करता है।
तो, Regexp उन विकल्पों को याद किया जाता है, यहां तक कि बाहरी पैटर्न के अंदर, मैच विफल समग्र पैटर्न के कारण:
pattern = /A #{ foo_regex }/i # => /A (?-mix:foo)/i
'A Foo' =~ pattern # => nil
यह सुनिश्चित करें कि सभी उप-भाव अपने आसपास के प्रतिमानों से मिलान करने के लिए संभव है , फिर भी है कि जल्दी से भी जटिल या गंदा हो सकता है:
foo_regex = /foo/i
pattern = /A #{ foo_regex }/i # => /A (?i-mx:foo)/i
'A Foo' =~ pattern # => 0
इसके बजाय हम source
विधि है जो एक पैटर्न का पाठ देता है:
/#{ /foo/.source }/ # => /foo/
/#{ /foo/i.source }/ # => /foo/
एम्बेडेड पैटर्न भी विकल्प को याद के साथ समस्या यह प्रकट होता है जब इस तरह के union
के रूप में अन्य Regexp तरीकों का उपयोग कर,:
/#{ Regexp.union(%w[a b]) }/ # => /(?-mix:a|b)/
और फिर, source
मदद कर सकते हैं:
/#{ Regexp.union(%w[a b]).source }/ # => /a|b/
सब जानने के बाद कि:
foo_regex = /foo/
pattern = /#{ foo_regex.source }/i # => /foo/i
'A Foo' =~ pattern # => 2
टिन मैन अच्छी सलाह देता है। रुबी एक पर्ल चाहता है। चूंकि यह प्रत्येक रेगेक्स को स्कोप्ड क्लस्टर समूह निर्माण (जैसे '(? Misx-misx:)' के साथ संकलित करता है। तो यह वाक्यविन्यास '/ string1 /' _no विकल्प_ के साथ एक regex संकलित करता है, और डिफ़ॉल्ट ''??misx: string 1)'' i' ध्वज के साथ संकलित एक और regex '/ string2/i 'है, इसे प्लस साइड में जोड़ता है '(? i-msx: स्ट्रिंग 2)'। चूंकि क्लस्टर समूह _scoped_ विकल्प हैं _inside_ क्लस्टर प्राथमिकता लेते हैं। तो, regex 2 के अंदर regex 1 है (? I-msx: string 2 (? -misx: string 1)) 'और निश्चित रूप से स्कोप' स्ट्रिंग 1' को निर्देशित करता है अब केस संवेदनशील है। –
sln
मैं नहीं कहूंगा रूबी एक पर्ल चाहता है। यह जावा, पर्ल और कुछ अन्य भाषाओं की तरह है जो उनके हिस्सों में मिश्रित है और रुबी के साथ आया है। –
जैसे सॉर्ट करें .. कोई भी मास्टर – sln