2012-06-21 6 views
12

रूबी /[[:punct:]]/ सभी "विराम चिह्न" से मेल खाना चाहिए। Wikipedia के अनुसार, इसका अर्थ है /[\]\[!"#$%&'()*+,./:;<=>[email protected]\^_`{|}~-]/ प्रति POSIX मानक।रुबी/[[: punct:]] क्यों/कुछ विराम चिह्नों को याद करते हैं?

यह मेल खाता है: -[]\;',./[email protected]#%&*()_{}::"?

हालांकि, यह मैच: =`~$^+|<> (कम से कम रूबी 1.9.3p194 में) है।

क्या देता है?

+3

मेरा ग्लिबैक दस्तावेज कहता है कि '[[: punct:]]' 'wctype (3)' किसी भी विराम चिह्न को कॉल करता है; 'ispunct (3) 'पृष्ठ कहता है' किसी भी प्रिंट करने योग्य चरित्र के लिए जांच करता है जो अंतरिक्ष या अल्फान्यूमेरिक वर्ण नहीं है। ' यह बहुत स्पष्ट लगता है। – sarnold

+1

[रूबी का आरई इंजन विशेष है, हालांकि) (http://www.geocities.jp/kosako3/oniguruma/doc/RE.txt) - यूनिकोड-केस और गैर-यूनिकोड-केस दोनों के लिए दस्तावेज है ' punct' कक्षा। मुझे अभी भी यकीन नहीं है कि इसका क्या अर्थ है, विशेष रूप से, लेकिन मुझे आशा है कि इससे मदद मिलती है। – sarnold

उत्तर

10

विराम चिह्न चरित्र वर्ग लोकेल द्वारा परिभाषित किया गया है। ओपन ग्रुप LC_TYPE definition for punct कहता है:

वर्णों को विराम चिह्नों के रूप में वर्गीकृत करने के लिए परिभाषित करें। POSIX लोकेल में, न तो <space> और न ही कक्षाओं अल्फा, अंक, या cntrl में कोई भी वर्ण शामिल किया जाएगा। लोकेल परिभाषा फ़ाइल में, ऊपरी, निचले, अल्फा, अंक, cntrl, xdigit, या निर्दिष्ट किए गए कीवर्ड के लिए निर्दिष्ट कोई वर्ण निर्दिष्ट नहीं किया जाएगा।

असल में, यह परिभाषित करता है कि कैसे punct अन्य चरित्र वर्गों exluding द्वारा परिभाषित किया जा सकता है, लेकिन यह वास्तव में सीधे विराम चिह्न प्रतीकों को परिभाषित नहीं करता - कि स्थान का काम है।

मुझे प्रत्येक लोकेल में क्या है इसके बारे में एक कैननिकल संदर्भ नहीं मिला। शायद कोई और जानता है। इस बीच, आप एक एलसी_TYPE पा सकते हैं जो punct वर्ण वर्ग से मेल खाता है, या केवल कक्षा निर्दिष्ट करें।

+0

एफडब्ल्यूआईडब्लू, मेरा लोकेल रेल का डिफ़ॉल्ट 'एन' है (गैर-रेल सादे आईआरबी के साथ भी सच है, और मेरा ओएस' en_US' है)। इसे ठीक करने के तरीके पर कोई सुझाव (केवल स्पष्ट होने के अलावा)?मुझे उम्मीद है कि अधिक यादृच्छिक गठिया नहीं हैं ... – Sai

1

प्रतीक से अधिक "Symbol, Math" category में है, विराम चिह्न श्रेणी नहीं है। आप यह देख सकते हैं यदि आप regex के कूट UTF-8 के लिए मजबूर (यह चूक स्रोत एन्कोडिंग के लिए, और शायद अपने स्रोत UTF-8 एन्कोडेड है, जबकि मेरा डिफ़ॉल्ट स्रोत कुछ और ही है):

2.1.2 :004 > /[[:punct:]]/u =~ '<' 
=> nil 
2.1.2 :005 > /[[:punct:]]/ =~ '<' 
=> 0 

आप तो एएससीआईआई एन्कोडिंग (/ n - अधिक विकल्प here) पर रेगेक्स को मजबूर करें) आप इसे '<' पंक में वर्गीकृत करेंगे, जो मुझे लगता है कि आप क्या चाहते हैं। हालांकि, यदि आपके स्रोत में यूटीएफ -8 के ASCII सबसेट के बाहर वर्ण हैं तो यह संभवतः समस्याएं पैदा करेगा।

2.1.2 :012 > /\p{S}/u =~ '<' 
=> 0 

नहीं है:

2.1.2 :009 > /[[:punct:]]/n =~ '<' 
=> 0 

एक बेहतर समाधान 'punct' है, जो UTF-8 एन्कोडिंग में से मेल खाता है '<' के स्थान पर बजाय अपने regex में 'प्रतीक' श्रेणी का उपयोग किया जाएगा श्रेणियों की एक लंबी सूची here

+0

प्रतीक में वास्तविक विराम चिह्न शामिल नहीं हैं जैसे कि ',।: "'। 2 का संयोजन ASCII रेंज में सभी "विराम चिह्न" वर्णों (जैसा कि POSIX द्वारा परिभाषित किया गया है) को शामिल करता है। हालांकि, यदि हम प्रतीक और विराम चिह्न सामान्य श्रेणी के संयोजन का उपयोग करते हैं तो मुद्रा संकेत, कॉपीराइट चिह्न, तीर और कई अन्य प्रतीकों को भी शामिल किया जाएगा। – nhahtdh