2012-03-06 6 views
17

उदाहरण के लिए, मैं mn लिए चीनी अक्षरों से मिलकर एक स्ट्रिंग का मिलान करना चाहते मैच के लिए, तो मैं उपयोग कर सकते हैं:उपयोग नियमित अभिव्यक्ति utf-8 एन्कोडिंग में किसी भी चीनी चरित्र

[single Chinese character regular expression]{m,n} 

वहाँ कुछ नियमित अभिव्यक्ति है एक चीनी चरित्र का, जो कि कोई चीनी वर्ण मौजूद हो सकता है?

+1

कम से कम, regex इंजन का उपयोग कर रहे के बारे में जानकारी प्रदान करें। –

+0

@ केविनबल्लार्ड मुझे पूरा यकीन नहीं है कि मैं किस इंजन का उपयोग कर रहा हूं। मुझे क्या पता है कि मैं 'flex' (lexer) – xiaohan2012

+0

में नियमित अभिव्यक्ति कार्यक्षमता का उपयोग करता हूं [यूटीएफ -8 वर्ण इनपुट पढ़ने के लिए एक फ्लेक्स (लेक्सिकल स्कैनर) कैसे बना सकता है? [Https://stackoverflow.com/ प्रश्न/921,648/कैसे करने वाली मेक-एक-फ्लेक्स-शाब्दिक-स्कैनर से पढ़े-utf-8-वर्ण-इनपुट) –

उत्तर

21

regex एक चीनी मैच के लिए (अच्छी तरह से, CJK) चरित्र

\p{script=Han} 

जो करने के लिए appreviated किया जा सकता है बस

\p{Han} 

मतलब यह है कि आपके regex संकलक requirement RL1.2 Properties from UTS#18 Unicode Regular Expressions पूरा करती है। पर्ल और जावा 7 दोनों उस कल्पना को पूरा करते हैं, लेकिन कई अन्य नहीं करते हैं।

+0

यह एक दयालु बात है कि फ्लेक्स इसका समर्थन नहीं कर रहा है। फिर भी धन्यवाद। – xiaohan2012

+2

@ xiaohan2012: मुझे नहीं लगता कि फ्लेक्स वास्तव में सभी –

+0

@ xiaohan2012 पर यूनिकोड का समर्थन करता है यदि मैं आप थे, तो मैं पर्ल या जावा के तहत उपलब्ध कुछ लेक्सिंग और पार्सिंग टूल का उपयोग करके उपयोग करना चाहता हूं, जो यूनिकोड का समर्थन करते हैं। – tchrist

5

जावा में,

\p{InCJK_UNIFIED_IDEOGRAPHS}{1,3} 
+0

ध्यान दें कि यह केवल यू + 4E00-U + 9FFF से ब्लॉक में वर्ण पाता है। यह मौजूद सभी चीनी पात्रों को नहीं मिला है। – martin

+0

प्रश्न सी और सी ++ के लिए फ्लेक्स लेक्सर के साथ टैग किया गया है जो '\ p {C}' वर्ण ब्लॉक का समर्थन नहीं करता है। –

-2

जावा 7 में और ऊपर, प्रारूप होना चाहिए: "\ p {इशान}"

+1

असल में, संपादन इतिहास से पता चलता है कि आपने 'इनहान' भी लिखा है, @ रॉबर्ट ने केवल स्वरूपण जोड़ा है, इसलिए अभिव्यक्ति मोनोस्पेस्ड –

+0

संकेत दिखाई देती है: आप * अपनी त्रुटि को सही करने के लिए इसे संपादित करने के लिए * चुन सकते हैं। ;-) – Robert

+0

प्रश्न यह नहीं पूछता कि जावा में इसे कैसे किया जाए, हालांकि। सवाल "फ्लेक्स-लेक्सर" टैग किया गया है। – hvd

0

वहाँ एक भी चीनी चरित्र, के कुछ नियमित अभिव्यक्ति है जो कोई चीनी वर्ण मौजूद हो सकता है?

सिफ़ारिश

एक फ्लेक्स-संगत शाब्दिक विश्लेषक के साथ चीनी अक्षरों और अन्य यूनिकोड कोड अंकों के साथ प्रतिमानों से मिलान करने के लिए, आप सी ++ कि फ्लेक्स के साथ पीछे संगत है के लिए RE/flex lexical analyzer इस्तेमाल कर सकते हैं। आरई/फ्लेक्स यूनिकोड का समर्थन करता है और लेक्सन और पार्सर्स बनाने के लिए बाइसन के साथ काम करता है। यूनिकोड सक्षम करने के लिए

%option flex unicode 
%% 
[肖晗] { printf ("xiaohan/2\n"); } 
%% 

उपयोग वैश्विक %option unicode:

आप इस तरह के रूप RE/फ्लेक्स विशिष्टताओं में यूनिकोड पैटर्न (और UTF-8 नियमित अभिव्यक्ति) लिख सकते हैं। आप किसी एकल पैटर्न के लिए यूनिकोड को प्रतिबंधित करने के लिए एक स्थानीय संशोधक (?u:) उपयोग कर सकते हैं (ताकि सब कुछ अभी भी ASCII/8 बिट फ्लेक्स में के रूप में है): तो तुम yytext उपयोग कर सकते हैं

%option flex 
%% 
(?u:[肖晗]) { printf ("xiaohan/2\n"); } 
(?u:\p{Han}) { printf ("Han character %s\n", yytext); } 
.    { printf ("8-bit character %d\n", yytext[0]); } 
%% 

विकल्प flex, फ्लेक्स संगतता सक्षम बनाता है, yyleng, ECHO, और इसी तरह। flex विकल्प RE/फ्लेक्स के बिना Lexer विधि कॉल की उम्मीद: text() (या str() और wstr()std::string और std::wstring के लिए), size() (या विस्तृत चार लंबाई के लिए wsize()), और echo()। आरई/फ्लेक्स विधि कॉल क्लीनर IMHO हैं, और विस्तृत चार संचालन शामिल हैं।

digit   [0-9] 
alpha   ([a-zA-Z_\xA8\xAA\xAD\xAF\xB2\xB5\xB7\xB8\xB9\xBA\xBC\xBD\xBE]|[\xC0-\xFF][\x80-\xBF]*|\\u([0-9a-fA-F]{4})) 
id    ({alpha})({alpha}|{digit})*    
:

पृष्ठभूमि

सादे पुराने फ्लेक्स में मैं ASCII अक्षरों और एक संकलक परियोजना है कि यूनिकोड पहचानकर्ता के लिए समर्थन id आवश्यक के लिए UTF-8 एन्कोडेड पत्र पर कब्जा करने के बदसूरत UTF-8 पैटर्न को परिभाषित करने समाप्त हो गया

alpha पैटर्न ASCII अक्षरों का समर्थन करता है, अंडरस्कोर, और यूनिकोड कोड अंक कि पहचानकर्ता में किया जाता है (\p{L} आदि)। पैटर्न इस पैटर्न प्रबंधनीय के आकार रखने के लिए पूरी तरह से आवश्यकता से अधिक यूनिकोड कोड अंक परमिट, तो यह सटीकता से कुछ कमी के लिए कॉम्पैक्ट कारोबार और अनुमति देने के लिए UTF-8 कुछ मामलों है कि वैध UTF-8 नहीं हैं में overlong characters। यदि आप समस्याओं और सुरक्षा चिंताओं से सावधान रहना चाहते हैं तो इस दृष्टिकोण के बारे में सोच रहे हैं। इसके बजाय एक यूनिकोड-सक्षम स्कैनर जनरेटर का उपयोग करें, जैसे कि RE/flex

  1. किसी भी यूनिकोड वर्ण से मेल खाते होने का खतरा हो सकता है के लिए अपने स्वयं के लिए UTF-8 फ्लेक्स में पैटर्न एन्कोडिंग:

    सुरक्षा

    जब फ्लेक्स पैटर्न में सीधे UTF-8 का उपयोग कर, वहाँ कई चिंताएं हैं त्रुटियों के लिए। पैटर्न केवल वैध यूनिकोड रेंज में वर्णों तक ही सीमित होना चाहिए। यूनिकोड कोड बिंदु U + 0000 को U + D7FF और U + E000 से U + 10FFFF तक कवर करते हैं। U + DFFF को सीमा U + D800 UTF-16 के किराए की जोड़े के लिए सुरक्षित और invalid code points हैं है। यूनिकोड रेंज को यूटीएफ -8 में बदलने के लिए टूल का उपयोग करते समय, अमान्य कोड बिंदुओं को बाहर करना सुनिश्चित करें।

  2. पैटर्न overlong और अन्य invalid byte sequences को अस्वीकार कर देना चाहिए। अवैध यूटीएफ -8 को चुपचाप स्वीकार नहीं किया जाना चाहिए।

  3. आदेश एक त्रुटि संदेश का उत्पादन करने में अपने lexer एक विशेष . (डॉट) की आवश्यकता होगी कि वैध और अवैध यूनिकोड से मेल खाता है, UTF-8 लगने और अवैध बाइट दृश्यों सहित शाब्दिक इनपुट त्रुटियों को पकड़ने के लिए, कि इनपुट अस्वीकार कर दिया है । आप के रूप में डॉट का उपयोग करते हैं एक "बाकी-सब-कुछ" एक त्रुटि संदेश के उत्पादन के लिए है, लेकिन अपने डॉट से मेल नहीं खाता अमान्य यूनिकोड, तो आप lexer रखती हूँ ("स्कैनर जाम है") या अपने lexer उत्पादन पर बकवास पात्रों गूंज जाएगा फ्लेक्स द्वारा "डिफ़ॉल्ट नियम"।

  4. आपके स्कैनर को UTF-8, UTF-16 (LE या BE), या UTF-32 (LE या BE) पर स्विच करने के लिए इनपुट में UTF BOM (यूनिकोड बाइट ऑर्डर मार्क) को पहचानना चाहिए।

  5. आप बाहर बिंदु के रूप में, इस तरह के रूप में [unicode characters] पैटर्न फ्लेक्स के साथ बिल्कुल काम नहीं करते, क्योंकि किसी ब्रैकेट सूची में UTF-8 वर्णों multibyte चरित्र और प्रत्येक एकल बाइट चरित्र मिलान किया जा सकता है, लेकिन नहीं UTF-8 वर्ण।

भी देखें invalid UTF encodings RE/फ्लेक्स उपयोगकर्ता गाइड में।

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