2012-11-26 3 views
6

रूबी 1.9.2 का उपयोग करना, मैं आईआरबी में निम्नलिखित रूबी कोड है:मैं इन दो लगभग समान रूबी रेगेक्स पैटर्न के लिए अलग-अलग परिणाम क्यों देख रहा हूं, और मुझे ऐसा लगता है कि मुझे क्या लगता है कि यह नहीं होना चाहिए?

> r1 = /^(?=.*[\d])(?=.*[\W]).{8,20}$/i 
> r2 = /^(?=.*\d)(?=.*\W).{8,20}$/i 
> a = ["password", "1password", "password1", "pass1word", "password 1"] 
> a.each {|p| puts "r1: #{r1.match(p) ? "+" : "-"} \"#{p}\"".ljust(25) + "r2: #{r2.match(p) ? "+" : "-"} \"#{p}\""} 

यह निम्न उत्पादन में परिणाम है:

r1: - "password"   r2: - "password" 
r1: + "1password"  r2: - "1password" 
r1: + "password1"  r2: - "password1" 
r1: + "pass1word"  r2: - "pass1word" 
r1: + "password 1"  r2: + "password 1" 

1.) क्यों परिणाम भिन्न हैं?

2.) r1 स्ट्रिंग्स 2, 3 और 4 पर मैच क्यों होगा? (?=.*[\W]) लुकहेड का कारण यह विफल नहीं होगा क्योंकि उन उदाहरणों में कोई गैर-शब्द वर्ण नहीं हैं?

+0

क्या आप कृपया '/^(? =। * [\ D]) (? =। * ([\ W]) से मिलान करने का प्रयास कर सकते हैं। {8,20} $/i' और कैप्चर किए गए उपयोग को बताएं समूह '1' कैप्चरिंग में? (मुझे डर है कि यह अंक है, लेकिन आप कभी नहीं जानते) –

+0

रूबी 1.9.3-पी 327: आर 1: - "पासवर्ड" आर 2: - "पासवर्ड" आर 1: - "1 पासवर्ड" आर 2: - "1 पासवर्ड" आर 1: - "पासवर्ड 1" आर 2: - "पासवर्ड 1" आर 1: - "पास 1वर्ड" आर 2: - "पास 1वर्ड" आर 1: + "पासवर्ड 1" आर 2: + "पासवर्ड 1" => ["पासवर्ड", "1 पासवर्ड "," पासवर्ड 1 "," पास 1वर्ड "," पासवर्ड 1 "] ऐसा लगता है कि आपको 1.9.2 के साथ एक बग मिल सकती है? –

+0

क्या आप इसे अपने प्रश्न में शामिल कर सकते हैं (उचित स्वरूपण के लिए) –

उत्तर

6

यह कुछ रेगेक्स सुविधाओं और यूनिकोड के बीच बातचीत से परिणाम देता है। \W सभी गैर-शब्द वर्ण हैं, जिनमें 212A - "KELVIN SIGN" (PDF link) और 017F - "LATIN SMALL LETTER LONG S" ſ (PDF link) शामिल हैं। /i इनमें से दोनों के निम्न केस संस्करण जोड़ता है, जो "सामान्य" k और s वर्ण (006B - "LATIN SMALL LETTER K" and 0073 "LATIN SMALL LETTER S" (PDF link)) हैं।

तो यह password में है जिसे कुछ मामलों में गैर-शब्द चरित्र के रूप में व्याख्या किया जा रहा है।

ध्यान दें कि ऐसा लगता है कि \W एक वर्ण वर्ग (यानी [\W]) में है। इसके अलावा मैं इसे केवल irb में पुन: उत्पन्न कर सकता हूं, एक स्टैंडअलोन स्क्रिप्ट के अंदर ऐसा लगता है कि यह अपेक्षित काम करता है।

अधिक जानकारी के लिए the Ruby bug about this देखें।

+1

अच्छी पकड़। यह महत्वपूर्ण नहीं है, लेकिन [वास्तविक समस्या] (https://bugs.ruby-lang.org/issues/4044#note-3) 'ß' नहीं है (जिसे' ss' में जोड़ा गया है), लेकिन 017F - लैटिन छोटे पत्र लंबे एस 'एस '(जो एक एकल के लिए तब्दील हो गया है)। – user123444555621

+0

@ Pumbaa80 धन्यवाद, यह और अधिक समझ में आता है, मैंने जवाब अपडेट किया है। मैंने बग रिपोर्ट पर एक अलग टिप्पणी से 'ß' लिया] (https://bugs.ruby-lang.org/issues/4044#note-9)। इस मामले में 'ß'' पासवर्ड 'में डबल-एस के कारण भी मेल खाता है, लेकिन वास्तविक मिलान एक एकल है, इसलिए शायद यह 's' है। – matt

+0

वाह, यह एक दिलचस्प विशेषता है :) स्पष्टीकरण और बग रिपोर्ट के लिंक के लिए धन्यवाद। –

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