2012-09-05 21 views
8

रेगेक्स में डबल स्क्वायर ब्रैकेट का क्या अर्थ है? मैं निम्न उदाहरण के बारे में उलझन में हूँ:नियमित अभिव्यक्ति में डबल ब्रैकेट का उपयोग कैसे करें?

/[[^abc]]/ 

/[^abc]/ 

मैं Rubular का उपयोग कर परीक्षण किया गया था, लेकिन मैं डबल कोष्ठक और एकल ब्रैकेट के साथ एक के बीच कोई अंतर नहीं देखा था।

+0

मैं बनाया [विस्तार-कोष्ठक] (https://www.npmjs.com/package/ विस्तार-ब्रैकेट), यदि आप पॉज़िक्स वर्ण वर्ग – jonschlinkert

उत्तर

8

Posix character classes उपयोग एक [:alpha:] अंकन है, जो एक नियमित अभिव्यक्ति के अंदर की तरह इस्तेमाल कर रहे हैं:

/[[:alpha:][:digit:]]/ 

आप एक तरीके ऊपर के लिंक में POSIX जानकारी प्राप्त करने के लिए नीचे स्क्रॉल करने की आवश्यकता होगी। दस्तावेज़ों से:

पॉज़िक्स ब्रैकेट अभिव्यक्ति वर्ण वर्गों के समान भी हैं। वे उपरोक्त के लिए पोर्टेबल विकल्प प्रदान करते हैं, अतिरिक्त लाभ के साथ जिसमें वे गैर-ASCII वर्ण शामिल हैं। उदाहरण के लिए,/\ d/केवल ASCII दशमलव अंक (0-9) से मेल खाता है; जबकि/[[: अंक:]]/यूनिकोड एनडी श्रेणी में किसी भी चरित्र से मेल खाता है।

/[[:alnum:]]/ - Alphabetic and numeric character 
/[[:alpha:]]/ - Alphabetic character 
/[[:blank:]]/ - Space or tab 
/[[:cntrl:]]/ - Control character 
/[[:digit:]]/ - Digit 
/[[:graph:]]/ - Non-blank character (excludes spaces, control characters, and similar) 
/[[:lower:]]/ - Lowercase alphabetical character 
/[[:print:]]/ - Like [:graph:], but includes the space character 
/[[:punct:]]/ - Punctuation character 
/[[:space:]]/ - Whitespace character ([:blank:], newline, 
carriage return, etc.) 
/[[:upper:]]/ - Uppercase alphabetical 
/[[:xdigit:]]/ - Digit allowed in a hexadecimal number (i.e., 0-9a-fA-F) 

रूबी भी निम्न गैर POSIX चरित्र वर्गों का समर्थन करता है:

/[[:word:]]/ - A character in one of the following Unicode general categories Letter, Mark, Number, Connector_Punctuation 
/[[:ascii:]]/ - A character in the ASCII character set 
# U+06F2 is "EXTENDED ARABIC-INDIC DIGIT TWO" 

/[[:digit:]]/.match("\u06F2") #=> #<MatchData "\u{06F2}"> 
/[[:upper:]][[:lower:]]/.match("Hello") #=> #<MatchData "He"> 
/[[:xdigit:]][[:xdigit:]]/.match("A6") #=> #<MatchData "A6"> 
+0

यह उत्तर "कैरेक्टर क्लासेस" के अंतर्गत [स्टैक ओवरफ्लो रेगुलर एक्सप्रेशन एफएक्यू] (http://stackoverflow.com/a/22944075/2736496) में जोड़ा गया है। – aliteralmind

4

'[[' का कोई विशेष अर्थ नहीं है। [xyz] एक वर्ण वर्ग है और एक x, y या z से मेल खाता है। कैरेट ^ सभी पात्रों को ब्रैकेट में नहीं लेता है।

सादगी के लिए ^ को हटाकर, आप देख सकते हैं कि पहला खुला ब्रैकेट पहले क्लोज़ ब्रैकेट के साथ मेल किया जा रहा है और दूसरा बंद ब्रैकेट चरित्र वर्ग के हिस्से के रूप में उपयोग किया जा रहा है। अंतिम करीबी ब्रैकेट को मिलान करने के लिए एक और चरित्र के रूप में माना जाता है।

irb(main):032:0> /[[abc]]/ =~ "[a]" 
=> 1 
irb(main):033:0> /[[abc]]/ =~ "a]" 
=> 0 

यह कुछ मामलों

irb(main):034:0> /[abc]/ =~ "a]" 
=> 0 
irb(main):034:0> /[abc]/ =~ "a" 
=> 0 

में अपने मूल रूप में एक ही परिणाम के लिए प्रकट होता लेकिन यह केवल इसलिए है क्योंकि आपके रेगुलर एक्सप्रेशन एक सटीक मिलान खोज नहीं कर रहा है।

irb(main):036:0> /^[abc]$/ =~ "a]" 
=> nil 
+1

के साथ मिलान करने के जावास्क्रिप्ट कार्यान्वयन को देखने में रुचि रखते हैं, तो ध्यान रखें कि यह सभी रेगेक्स स्वादों के लिए सही नहीं है। उदाहरण के लिए, जावा इसे एक चरित्र वर्ग के रूप में मानता है जिसमें कुछ और चरित्र वर्ग नहीं है, इसलिए '[[^ abc]] 'और' [^ abc] 'प्रभावी रूप से समान हैं। –

+0

एफडब्ल्यूआईडब्ल्यू - पायथन के उपरोक्त उत्तर के बराबर व्यवहार है, अन्य भाषाओं के बारे में निश्चित नहीं है, या यह क्या करना चाहिए, हालांकि मैं @AlanMoore के व्यवहार को पसंद करूंगा। – dfb