एक regex में [[.ch।]] का क्या अर्थ है?


11

वैकल्पिक शीर्षक: POSIX- आज्ञाकारी रेगेक्स में एक "कोलेटिंग सीक्वेंस" या "कोलेटिंग एलिमेंट" क्या है?

मुझे सूची में आइटम # 4 के रूप में POSIX चश्मा की धारा 9.3.5 में सटीक तकनीकी परिभाषा मिली , लेकिन यह वास्तव में मेरे लिए स्पष्ट नहीं है।

मैं उदाहरणों और स्पष्टीकरणों के लिए वेब पर घूमता रहा और पूरी तरह से खाली हाथ नहीं आया , लेकिन निश्चित रूप से प्रबुद्ध नहीं हुआ ।

केवल एक चीज जो मुझे मिली है, वह यह है कि कुछ परिस्थितियों में, आप अपने regex को कई वर्णों का इलाज कर सकते हैं, जैसे कि वे लंबाई की तुलना और "सबसे लंबा मैच" क्या है, यह निर्धारित करने के उद्देश्य से एक एकल वर्ण थे (क्योंकि regexes लालची हैं सबसे लंबे समय तक संभव मैच लौटा)।

यह सब है, हालांकि? मुझे इसका उपयोग करने में परेशानी हो रही है, लेकिन मुझे संदेह है कि मेरी समझ अधूरी है। वास्तव में एक रेगेक्स के लिए "कोलाटिंग" क्या है? और कैसे करता है [[.ch.]], उदाहरण POSIX चश्मा में, इस से संबंधित है?

जवाबों:


7

कॉलिंग तत्वों को आमतौर पर छँटाई के संदर्भ में संदर्भित किया जाता है।

कई भाषाओं में, टकराव (एक शब्दकोश में छंटनी) केवल प्रति-चरित्र नहीं किया जाता है। उदाहरण के लिए, चेक में, यह अंग्रेजी में नहीं होगा और इसके chबीच की तरह नहीं है , लेकिन इसे सॉर्टिंग के लिए संपूर्ण माना जाता है। यह (हम यहाँ एक चरित्र का उल्लेख नहीं कर सकते, चरित्र का मिलान तत्वों का एक सबसेट है) कि बीच में एक तरह एक collating तत्व है और ।cgcihi

अब आप पूछ सकते हैं कि नियमित भावों के साथ क्या करना है? , मैं एक कोष्ठक अभिव्यक्ति में एक कोलाजिंग तत्व का उल्लेख क्यों करना चाहूंगा?

खैर, ब्रैकेट के भावों के अंदर, व्यक्ति ऑर्डर का उपयोग करता है। उदाहरण के लिए [c-j], आप वर्णों को बीच c- बीच में चाहते हैं j। आप अच्छी तरह से करते हैं? आप बल्कि वहाँ के तत्वों को जोड़ना चाहते हैं। [h-i]चेक लोकेल मैचों में ch:

$ echo cho | LC_ALL=cs_CZ.UTF-8 grep '^[h-i]o'
cho

इसलिए, यदि आप कोष्ठक अभिव्यक्ति में विभिन्न श्रेणी के तत्वों को सूचीबद्ध करने में सक्षम हैं, तो आप उन्हें व्यक्तिगत रूप से भी सूचीबद्ध करने में सक्षम होंगे। [a-cch]के बीच में है कि क्रमवार तत्वों का मिलान होगा aऔर cऔर cऔर hअक्षर। करवाने के लिए a-cऔर chक्रमवार तत्व, हम एक नई वाक्य रचना की जरूरत है:

$ echo cho | LC_ALL=cs_CZ.UTF-8 grep '^[a-c[.ch.]]o'
cho

(बीच में लोगों को aऔर cऔर chएक)।

अब, दुनिया अभी तक परिपूर्ण नहीं है और शायद कभी नहीं होगी। ऊपर का उदाहरण एक GNU सिस्टम पर था और काम किया। एक कोलाजिंग तत्व का एक अन्य उदाहरण eUTF-8 में तीव्र उच्चारण के संयोजन के साथ हो सकता है ( $'e\u0301'जैसे प्रस्तुत $'\u00e9'किया गया é)।

é और é समान वर्ण होते हैं सिवाय इसके कि एक को एक वर्ण से और दूसरे को दो से दर्शाया जाता है।

$ echo $'e\u301t\ue9' | grep '^[d-f]t'

कुछ सिस्टम पर ठीक से काम करेंगे लेकिन दूसरों को नहीं (उदाहरण के लिए जीएनयू वाले नहीं)। और यह है कि क्या स्पष्ट नहीं है कि $'[[.\ue9.]]'केवल मेल खाना चाहिए $'\ue9'या दोनों $'\ue9'और $'e\u301'

गैर-वर्णनात्मक लिपियों, या अलग-अलग, क्षेत्रीय, सॉर्टिंग ऑर्डर, ffi ( ffiएक चरित्र में) जैसी चीजों के साथ लिपियों का उल्लेख नहीं करना चाहिए जो इस तरह के एक साधारण एपीआई के साथ संभालने के लिए मुश्किल हो जाते हैं।


1

यह तब उपयोगी है जब गैर-अंग्रेजी (गैर-अस्की) वर्ण उपयोग में हों। आपके द्वारा उल्लिखित उदाहरण chएक डिग्राफ है , अर्थात कुछ भाषाओं में उनके वर्णमाला में एक अक्षर होता है जो कि / अंग्रेजी वर्णमाला में दो अक्षरों द्वारा दर्शाया जा सकता है।

जब आप [.ch.]एक regexp में उपयोग करते हैं , तो आप मूल रूप से कहते हैं: "मैं chडिग्राफ के साथ एक गैर-अंग्रेजी इनपुट अनुक्रम की अपेक्षा करता हूं। मैं चाहता हूं कि मेरा regexp एकल चरक से मेल खाए ch। मेरी प्रोग्रामिंग भाषा / regex इंजन / कीबोर्ड मुझे इस digraph को लिखने की अनुमति नहीं देता है। प्रवेश करते हैं, तो मैं में टाइप [.ch.]। मैं एक मतलब यह नहीं है cएक के बाद h। कृपया केवल एक ही चरित्र के रूप में संयुक्ताक्षर की आवृत्तियां पाते हैं। "

[[.ch.]]इसका मतलब है कि डिग्राफ, पात्रों के एक सेट का हिस्सा है। इस मामले में वास्तव में केवल एक चरित्र। बस मानक regexp संकेतन।


से स्टीफ़न का जवाब ऐसा लगता है कि ch है वास्तव में दो अलग-अलग पात्रों; यह सिर्फ छंटाई के प्रयोजनों के लिए एक के रूप में माना जाता है। क्या आप सुनिश्चित हैं कि "डिग्राफ" एक लागू अवधि है?
वाइल्डकार्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.