2012-10-31 20 views
11

मैं अपने कोड, यूआरएल के आकार से मिलान करने के लिए है, जिसमें एक regex हो गया और त्रुटि फेंक दिया "वर्ण वर्ग त्रुटि में खाली रेंज":नियमित अभिव्यक्ति

/^(http|https):\/\/([\w-]+\.)+[\w-]+([\w- .\/?%&=]*)?$/ 

त्रुटि थी "वर्ण वर्ग त्रुटि में खाली रेंज" । मैंने पाया कि इसका कारण ([\w- .\/?%&=]*)? भाग में है। रुबी -\w- . में एक शाब्दिक - की बजाय सीमा के लिए ऑपरेटर के रूप में पहचानने लगता है। डैश में भागने के बाद, समस्या हल हो गई थी।

लेकिन मूल नियमित अभिव्यक्ति मेरे सहकर्मियों की मशीनों पर अच्छी तरह से चल रही थी। हम ओएसएक्स, रेल और रूबी के समान संस्करण का उपयोग करते हैं: रूबी संस्करण रूबी 1.9.3 पी 1 9 4 है, रेल 3.1.6 है और ओएसएक्स 10.7.5 है। और हमारे हेरोकू सर्वर पर कोड तैनात करने के बाद, सब ठीक काम किया। इस रेगेक्स के संबंध में केवल मेरे पर्यावरण में त्रुटि क्यों हुई? रुबी रेगेक्स व्याख्यान का तंत्र क्या है?

+5

मैं नहीं जानता कि क्यों यह और एक अन्य पर नहीं एक मशीन पर काम किया है, लेकिन चरित्र कक्षाओं में हाइफ़न चाहिए हमेशा या तो बच निकले या चरित्र वर्ग की शुरुआत या अंत में। अन्यथा इंजन इसे एक सीमा बनाने का फैसला कर सकता है। हाइफ़ेंस को अन्य श्रेणियों के बाद भी अनुमति दी जाती है (जैसे '[ए-जेड -_]') लेकिन यह भी निराश है, मैं भी कहूंगा। –

+2

रूबी का क्या संस्करण? क्या यह एक मौजूदा संस्करण है जिसमें वैकल्पिक रेगेक्स समर्थन संकलित है? कम से कम संस्करण, संभवतः ओएस आदि के बारे में कोई विवरण प्रदान किए बिना, मदद करना असंभव है। –

+0

आपकी मदद के लिए धन्यवाद दोस्तों। डेव करने के लिए: रूबी संस्करण रूबी 1.9.3 पी 1 9 4 है, रेल 3.1.6 है और ओएसएक्स 10.7.5 है। मुझे यकीन नहीं है कि मेरी रूबी अन्य वैकल्पिक regex समर्थन के साथ आता है। क्या आप अपने विचार साझा कर सकते हैं? – Steve

उत्तर

13

मैं आरबीएम 1.13.4 का उपयोग कर उबंटू 12.04.1 एलटीएस पर स्थापित रूबी 1.9.3p194 (2012-04-20 संशोधन 35410) [i686-linux] पर इस त्रुटि को दोहरा सकता हूं। हालांकि, यह एक संस्करण-विशिष्ट त्रुटि नहीं होनी चाहिए। वास्तव में, मुझे आश्चर्य है कि यह अन्य मशीनों पर भी काम करता था।

एक एक सरल प्रदर्शन करती है और बस के रूप में अच्छी तरह से विफल रहता है: बल्कि एक चरित्र वर्ग से

"abcd" =~ /[\w- ]/ 

इसका कारण यह है [\w- ] के रूप में "एक सीमा अंतरिक्ष (या खाली) तक किसी भी शब्द चरित्र के साथ शुरुआत" व्याख्या की है, जिसमें एक शब्द, एक हाइफ़न या एक स्थान होता है, जो आप चाहते थे।

Per Ruby's regular expression documentation:

Within a character class the hyphen (-) is a metacharacter denoting an inclusive range of characters. [abcd] is equivalent to [a-d]. A range can be followed by another range, so [abcdwxyz] is equivalent to [a-dw-z]. The order in which ranges or individual characters appear inside a character class is irrelevant.

आप को देखा तो, prepending एक बैकस्लैश हाइफन बच गए इस प्रकार, एक चरित्र वर्ग के लिए एक सीमा से regexp की प्रकृति को बदलने त्रुटि को दूर करने के रूप में। हालांकि, चरित्र वर्ग के बीच में हाइफ़न से बचने की सिफारिश नहीं की जाती है, क्योंकि ऐसे मामलों में हाइफ़न के इच्छित अर्थ को भ्रमित करना आसान है। के रूप में m.buettner ने कहा, हमेशा या तो शुरुआत में या एक चरित्र वर्ग के अंत हाइफ़न जगह:

"abcd" =~ /[-\w ]/ 
संबंधित मुद्दे