gsub

2012-04-27 17 views
9

के साथ अजीबता मैं रेल एप्लिकेशन में स्ट्रिंग में गैर शब्द वर्णों को हटाने के लिए gsub का उपयोग करने का प्रयास कर रहा था। मैं निम्नलिखित कोड का इस्तेमाल किया:gsub

somestring.gsub(/[\W]/i, '') #=> "" 

लेकिन यह वास्तव में गलत है, यह पत्र k रूप में अच्छी तरह निकाल देंगे। सही एक होना चाहिए:

somestring.gsub(/\W/i, '') #=> "kkk" 

लेकिन मेरी समस्या यह है कि एक रेल नियंत्रक जो ऊपर कोड का उपयोग कर rspec काम नहीं करता है शामिल की इकाई परीक्षण, इकाई परीक्षण वास्तव में गुजरता है। इसलिए मैं rspec

it "test this gsub" do 
    'kkk'.gsub(/[\W]/i, '').should == 'kkk' 
end 

ऊपर परीक्षण का मामला असफल चाहिए में एक सुंदर चरम परीक्षण का मामला बनाया है, लेकिन यह वास्तव में गुजरता है। यहां क्या समस्या है? परीक्षा पास क्यों होगी?

+2

परीक्षण विफल क्यों होगा? जहां तक ​​मैं देख सकता हूं उस कार्य के लिए '/ [\ W]/i' एक पूरी तरह से वैध regexp है। उस मामले में ब्रैकेट अनावश्यक हैं, लेकिन इससे कुछ भी नुकसान नहीं पहुंचाता है। –

+0

क्या आपने वास्तव में 'irb' में अपने regexps को आजमाया था? '" केकेके ".gsub (..) 'यह इस तरह काम करता है, और परिणाम" केकेके "है, इसलिए परीक्षण पास हो जाता है। आप क्या उम्मीद कर रहे हैं परिणाम क्या है? – Casper

+1

@ कैस्पर असल में, 'kkk'.gsub (/ [\ W]/i,' '' चलाते समय '' ''' '' '। तुलनात्मक रूप से, 'kkk'.gsub (/ \ W/i,' '' ''' रिटर्न' 'kkk' 'चल रहा है। –

उत्तर

5

रूबी 1.9 एक अलग नियमित अभिव्यक्ति इंजन (Oniguruma) पर स्विच किया गया, जो व्यवहार में परिवर्तन के लिए जिम्मेदार है। यह इसमें एक बग की तरह लगता है।

अपने उदाहरण के लिए, यदि आप एक केस संवेदी मैच को निर्दिष्ट नहीं द्वारा समस्या के समाधान प्राप्त कर सकते हैं:

irb(main):001:0> 'kkk'.gsub(/[\W]/i, '') 
=> "" 
irb(main):002:0> 'kkk'.gsub(/[\W]/, '') 
=> "kkk" 
irb(main):004:0> 'kkk'.gsub(/\W/i, '') 
=> "kkk" 
irb(main):003:0> 'kkk'.gsub(/\W/, '') 
=> "kkk" 

अद्यतन: यह हटाने के चरित्र समूह एक और तरीका है की तरह लग रहा है। ऐसा हो सकता है कि इस तरह के नकारात्मक मैच एक चरित्र समूह में जरूरी नहीं हैं?

+0

क्या आपको लगता है ... नहीं, यह नहीं हो सका ... यह '\ W' ले रहा है और इसे \ w' बना रहा है क्योंकि यह मामला असंवेदनशील है? यह वास्तव में ऐसा नहीं कर सका, है ना ?? O_O –

+0

मुझे उम्मीद नहीं है ... लेकिन आप कभी नहीं जानते। यह संभवतः यह पुष्टि करने के लिए http://bugs.ruby-lang.org पर लाया जाना चाहिए कि दोष कहां स्थित है – Nevir

+0

बग यहां पुष्टि की गई http://www.rubular.com/ भी। आप 1.8.7 और 1.9.2 के बीच स्विच कर सकते हैं और अंतर देख सकते हैं। – Casper