2010-11-23 14 views
7

रूबी 1.8.7। मैं स्ट्रिंग की शुरुआत में पैटर्न से मेल खाने के लिए^के साथ रेगेक्स का उपयोग कर रहा हूं। समस्या यह है कि अगर पैटर्न की स्ट्रिंग में की शुरुआत में पाया जाता है तो यह अभी भी मेल खाता है। यह वह व्यवहार है जो मैं अपेक्षा करता हूं कि अगर मैं 'एम' संशोधक का उपयोग कर रहा हूं लेकिन मैं नहीं हूं:रुबी रेगेक्स:^एम एम संशोधक के बिना भी लाइन की शुरूआत?

$ irb 
irb(main):001:0> str = "hello\ngoodbye" 
=> "hello\ngoodbye" 
irb(main):002:0> puts str 
hello 
goodbye 
=> nil 
irb(main):004:0> str =~ /^goodbye/ 
=> 6 

मैं यहां क्या गलत कर रहा हूं?

+4

ग्रेट संसाधन ... http://rubular.com/ –

उत्तर

1

"^" लाइन की शुरुआत है। आप जो चाहते हैं उसे बनाने के लिए, आप स्ट्रिंग को विभाजित कर सकते हैं और केवल पहली पंक्ति का परीक्षण कर सकते हैं। लेकिन मुझे लगता है कि कुछ बेहतर तरीका मौजूद है। लाइन की

str.split("\n")[0] =~ /^hello/ 
17
  • शुरू: $
  • स्ट्रिंग की शुरुआत:^पंक्ति का
  • अंत \ स्ट्रिंग का एक
  • अंत: \ z
7

आपका भ्रम उचित है। अधिकांश रेगेक्स स्वादों में, ^\A के बराबर है और $ डिफ़ॉल्ट रूप से \Z के समतुल्य है, और आपको "अन्य पंक्तियों" को अन्य अर्थों (यानी लाइन सीमाओं) पर लेने के लिए "मल्टीलाइन" ध्वज सेट करना होगा। रुबी में, ^ और $हमेशा लाइन सीमाओं पर मेल खाते हैं।

भ्रम में जोड़ने के लिए, रूबी के पास कुछ "मल्टीलाइन" मोड है, लेकिन वास्तव में यह है कि हर कोई "सिंगल-लाइन" या "डॉटल" मोड कहता है: यह . मेटाएक्टेक्टर का अर्थ बदलता है, जिससे इसे अनुमति मिलती है मैच लाइन-सेपरेटर वर्ण (जैसे \r, \n) साथ ही साथ अन्य सभी पात्र।

+0

कौन सा रेगेक्स स्वाद आपके द्वारा वर्णित व्यवहार है? –

+0

@Wayne: अन्य सभी पर्ल-व्युत्पन्न स्वाद इस तरह से काम करते हैं: पर्ल, पीएचपी, पायथन, जावास्क्रिप्ट, जावा, .NET ... यदि इसमें "मल्टीलाइन" मोड है, तो इसका अर्थ यह है: '^' बन जाता है "शुरू होता है लाइन "और' $ '" लाइन का अंत "बन जाता है। मैं नहीं कह रहा हूं रूबी का दृष्टिकोण गलत है, बीटीडब्ल्यू; मेरी इच्छा है कि उन्होंने नामों को मिश्रित नहीं किया था जैसा उन्होंने किया था। एकमात्र स्वाद जो वास्तव में सही हो जाता है वह पर्ल 6/तोता है, जो "मल्टीलाइन" * और * "सिंगल-लाइन" मोड को समाप्त करता है। –

+0

हां, मुझे सी और पर्ल में रेगेक्स करने के लिए उपयोग किया जाता है जो उसी तरह^^ रूबी का उपयोग करता है। मैंने सोचा कि सी रेगेक्स लाइब्रेरी 'निश्चित' थी - स्पष्ट रूप से मुझे गलत था। आपके उत्तरों के लिए धन्यवाद। – SteveRawlinson

संबंधित मुद्दे