वहाँ एक भी चीनी चरित्र, के कुछ नियमित अभिव्यक्ति है जो कोई चीनी वर्ण मौजूद हो सकता है?
सिफ़ारिश
एक फ्लेक्स-संगत शाब्दिक विश्लेषक के साथ चीनी अक्षरों और अन्य यूनिकोड कोड अंकों के साथ प्रतिमानों से मिलान करने के लिए, आप सी ++ कि फ्लेक्स के साथ पीछे संगत है के लिए 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।
किसी भी यूनिकोड वर्ण से मेल खाते होने का खतरा हो सकता है के लिए अपने स्वयं के लिए UTF-8 फ्लेक्स में पैटर्न एन्कोडिंग:
सुरक्षा
जब फ्लेक्स पैटर्न में सीधे UTF-8 का उपयोग कर, वहाँ कई चिंताएं हैं त्रुटियों के लिए। पैटर्न केवल वैध यूनिकोड रेंज में वर्णों तक ही सीमित होना चाहिए। यूनिकोड कोड बिंदु U + 0000 को U + D7FF और U + E000 से U + 10FFFF तक कवर करते हैं। U + DFFF को सीमा U + D800 UTF-16 के किराए की जोड़े के लिए सुरक्षित और invalid code points हैं है। यूनिकोड रेंज को यूटीएफ -8 में बदलने के लिए टूल का उपयोग करते समय, अमान्य कोड बिंदुओं को बाहर करना सुनिश्चित करें।
पैटर्न overlong और अन्य invalid byte sequences को अस्वीकार कर देना चाहिए। अवैध यूटीएफ -8 को चुपचाप स्वीकार नहीं किया जाना चाहिए।
आदेश एक त्रुटि संदेश का उत्पादन करने में अपने lexer एक विशेष .
(डॉट) की आवश्यकता होगी कि वैध और अवैध यूनिकोड से मेल खाता है, UTF-8 लगने और अवैध बाइट दृश्यों सहित शाब्दिक इनपुट त्रुटियों को पकड़ने के लिए, कि इनपुट अस्वीकार कर दिया है । आप के रूप में डॉट का उपयोग करते हैं एक "बाकी-सब-कुछ" एक त्रुटि संदेश के उत्पादन के लिए है, लेकिन अपने डॉट से मेल नहीं खाता अमान्य यूनिकोड, तो आप lexer रखती हूँ ("स्कैनर जाम है") या अपने lexer उत्पादन पर बकवास पात्रों गूंज जाएगा फ्लेक्स द्वारा "डिफ़ॉल्ट नियम"।
आपके स्कैनर को UTF-8, UTF-16 (LE या BE), या UTF-32 (LE या BE) पर स्विच करने के लिए इनपुट में UTF BOM (यूनिकोड बाइट ऑर्डर मार्क) को पहचानना चाहिए।
आप बाहर बिंदु के रूप में, इस तरह के रूप में [unicode characters]
पैटर्न फ्लेक्स के साथ बिल्कुल काम नहीं करते, क्योंकि किसी ब्रैकेट सूची में UTF-8 वर्णों multibyte चरित्र और प्रत्येक एकल बाइट चरित्र मिलान किया जा सकता है, लेकिन नहीं UTF-8 वर्ण।
भी देखें invalid UTF encodings RE/फ्लेक्स उपयोगकर्ता गाइड में।
कम से कम, regex इंजन का उपयोग कर रहे के बारे में जानकारी प्रदान करें। –
@ केविनबल्लार्ड मुझे पूरा यकीन नहीं है कि मैं किस इंजन का उपयोग कर रहा हूं। मुझे क्या पता है कि मैं 'flex' (lexer) – xiaohan2012
में नियमित अभिव्यक्ति कार्यक्षमता का उपयोग करता हूं [यूटीएफ -8 वर्ण इनपुट पढ़ने के लिए एक फ्लेक्स (लेक्सिकल स्कैनर) कैसे बना सकता है? [Https://stackoverflow.com/ प्रश्न/921,648/कैसे करने वाली मेक-एक-फ्लेक्स-शाब्दिक-स्कैनर से पढ़े-utf-8-वर्ण-इनपुट) –