2013-06-28 9 views
5

मैं इस चरित्र को अफ्रीकी योरूबा भाषा 'ẹ' में मिलान करना चाहता हूं। आमतौर पर यह 'é' को डॉट डायक्रिटिक के तहत '\ u0323' के संयोजन से बनाया जाता है। मैंने पाया कि:जावास्क्रिप्ट रेगेक्स + यूनिकोड डायक्रिटिक संयोजन अक्षरों

'é\u0323'.match(/[é]\u0323/) works but 
'ẹ́'.match(/[é]\u0323/) does not work. 

मैं सिर्फ ई से मेल नहीं करना चाहता हूं। मैं सभी संयोजनों से मेल खाना चाहता हूं। अभी, मेरे समाधान में सभी संयोजनों का आकलन शामिल है। इस प्रकार: /[ÁÀĀÉÈĒẸE̩Ẹ́É̩Ẹ̀È̩Ẹ̄Ē̩ÍÌĪÓÒŌỌO̩Ọ́Ó̩Ọ̀Ò̩Ọ̄Ō̩ÚÙŪṢS̩áàāéèēẹe̩ẹ́é̩ẹ̀è̩ẹ̄ē̩íìīóòōọo̩ọ́ó̩ọ̀ò̩ọ̄ō̩úùūṣs̩]/

क्या ऐसा करने के लिए एक छोटा और बेहतर तरीका नहीं हो सकता है, या यूनिकोड डायक्रिटिक संयोजनों के जावास्क्रिप्ट में रेगेक्स मिलान करना आसानी से काम नहीं करता है? धन्यवाद

+0

यदि मुझे ईमानदार होना है, तो मैं डिक्रिप्ट की तुलना में वर्णों की छोटी स्ट्रिंग को पढ़ और बनाए रखूंगा और संभवतः अधिक चालाक रेगेक्स के \ uxxxx भाग को समझूंगा। एक लुकअप टेबल का उपयोग करना हमेशा पहले चार की गणना करने से तेज़ होगा। एक संभावित तरीका अगर रेगेक्स विफल रहता है तो आप एक अवधि में चार को प्रस्तुत करना है और फिर – mplungjan

+0

की तुलना करना एक अच्छा बिंदु है। शायद वर्तमान तरीका बेहतर है। – user2530580

+0

मैं \ uxxxx भाग के साथ जा रहा था क्योंकि इसे विम में संपादित करने से बहुत अधिक समझ में आया जब अलग-अलग प्रवाह दिशाओं के साथ अलग-अलग चौड़ाई यूनिकोड बिंदु नहीं थे, कर्सर की स्थिति के साथ काफी अद्भुत चीजें कर रही थीं: इसकी स्थिति मूल रूप से एक यादृच्छिक चर बन गई । – user2530580

उत्तर

3

आम तौर पर इस डॉट विशेषक के तहत एक '\ u0323' के साथ एक 'ई' के संयोजन

हालांकि द्वारा किया जाता है, कि तुम यहाँ क्या नहीं है यू +0065, यू +0323 लेकिन यू + 1 ईबी 9, यू + 0301 - एक तीव्र डायक्रिटिक के साथ संयोजन।

सामान्य समाधान तुलना करने से पहले प्रत्येक स्ट्रिंग (आमतौर पर यूनिकोड सामान्य फॉर्म सी) को सामान्यीकृत करना होगा।

मैं सिर्फ ई से मेल नहीं करना चाहता हूं। मैं सभी संयोजनों से मेल खाना चाहता हूं

डायक्रिटिकल के बिना मिलान आम तौर पर सामान्य फॉर्म डी को सामान्यीकृत करके और सभी संयोजन वर्णक्रमीय पात्रों को हटाकर किया जाता है।

दुर्भाग्य से जेएस में सामान्यीकरण उपलब्ध नहीं है, इसलिए यदि आप इसे चाहते हैं तो आपको कोड करने के लिए कोड में खींचना होगा, जिसमें एक बड़ी यूनिकोड डेटा तालिका शामिल होगी। ऐसा एक प्रयास unorm है। यूनिकोड प्रीप्रोर्टीज के आधार पर अक्षरों को चुनने के लिए अक्षरों को चुनने के लिए, आपको यूनिकोड डेटाबेस के लिए समर्थन के साथ एक regexp इंजन की आवश्यकता होगी, जैसे XRegExp Unicode Categories

सर्वर-साइड भाषाएं (जैसे पायथन, .NET) आमतौर पर यूनिकोड सामान्यीकरण के लिए मूल समर्थन प्राप्त करती है, इसलिए यदि आप सर्वर पर प्रसंस्करण कर सकते हैं जो आम तौर पर आसान होगा।

+0

यह बताता है। धन्यवाद – user2530580

+0

बॉबन्स जब आपके पास एक मिनट है तो आप इसे ES6 के 'असामान्य' के संदर्भ में अपडेट कर सकते हैं। – Sergio

4

आम तौर पर समाधान Unicode properties and/or scripts का उपयोग करना होगा, लेकिन जावास्क्रिप्ट उन्हें मूल रूप से समर्थन नहीं करता है।

लेकिन वहां lib XRegExp मौजूद है जो इस समर्थन को जोड़ता है। इस lib के साथ आप

\p{L} का उपयोग कर सकते हैं: किसी भी भाषा से किसी भी प्रकार का पत्र मिलान करने के लिए।

\p{M}: एक चरित्र जिसे किसी अन्य चरित्र (जैसे उच्चारण, उमौट, संलग्न बक्से इत्यादि) के साथ जोड़ा जाना है।

तो अपने चरित्र वर्ग इस प्रकार दिखाई देगा:

[\p{L}\p{M}]+ 

कि सभी संभव पत्र है कि यूनिकोड तालिका में हैं से मेल खाएगा।

यदि आप इसे सीमित करना चाहते हैं, तो आप Unicode स्क्रिप्ट पर एक नज़र डाल सकते हैं और \p{L} को किसी स्क्रिप्ट द्वारा प्रतिस्थापित कर सकते हैं, वे कुछ भाषाओं से सभी अक्षरों को एकत्र करते हैं। जैसे सभी सिरिलिक अक्षरों के लिए सभी लैटिन अक्षरों या \p{Cyrillic} के लिए \p{Latin}

'ẹ́' 

है कि:

+0

मैं ऊपर उठाना होगा, यह सिर्फ पुस्तकालय का उपयोग करने के लिए हो सकता है। – user2530580

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