2015-01-23 11 views
7

में बहु-बाइट वर्ण क्या libc6 के regexp फ़ंक्शन regcomp और regexec प्राप्त करने के लिए वैसे भी बहु-बाइट वर्णों के साथ काम करने के लिए है?libc regcomp और regexec

उदाहरण के लिए, यदि मेरा पैटर्न utf8 वर्ण 猫机+猫 है, तो utf8 एन्कोडेड स्ट्रिंग 猫机机机猫 पर एक मिलान ढूंढने में विफल रहेगा, जहां यह सफल होना चाहिए।

मुझे लगता है कि इस वजह से चरित्र की बाइट प्रतिनिधित्व \xe6\x9c\xba है, और + एक या बाइट \xba के अधिक मिलान किया जाता है। मैं इस उदाहरण को पैटर्न में प्रत्येक मल्टीबाइट चरित्र के चारों ओर कोष्ठक डालकर काम कर सकता हूं, लेकिन चूंकि यह एक एप्लिकेशन के लिए है, इसलिए मुझे उपयोगकर्ताओं को ऐसा करने की आवश्यकता नहीं है।

क्या यूटीएफ 8 अक्षरों के रूप में मिलान करने के लिए पैटर्न या स्ट्रिंग को ध्वजांकित करने का कोई तरीका है? शायद libc को पैटर्न के बजाय चार के बजाय wchar के रूप में स्टोर करने के लिए कह रहे हैं?

+0

बहु-बाइट चार के आसपास के माता-पिता मदद नहीं करते हैं? – stark

+0

मैं ऐसा कर सकता हूं, लेकिन मैं ऐसे समाधान की उम्मीद कर रहा हूं जिसके लिए उपयोगकर्ता को पैटर्न को इस तरह से बदलने की आवश्यकता नहीं है। फिर भी आपका धन्यवाद! मैंने आपकी टिप्पणी को दर्शाने के लिए प्रश्न संपादित किया। –

+0

क्यों न केवल कोडपॉइंट '\ x {nnnnnnn}' का उपयोग करें? यही है, अगर रेगेक्स इंजन को यूनिकोड का समर्थन करना चाहिए। आम तौर पर रेगेक्स और लक्ष्य स्ट्रिंग को एक ही एन्कोडिंग का उपयोग करना चाहिए, लेकिन रेगेक्स स्ट्रिंग के भीतर शाब्दिक यूनिकोड वर्णों का उपयोग करना अच्छा नहीं है। यदि इंजन इसका समर्थन करता है, तो यह चार इकाइयों में चार को पढ़ता है, बाइट इकाइयों नहीं। – sln

उत्तर

1

क्या आप अपना रेगेक्स बनाने के लिए रेगेक्स का उपयोग कर सकते हैं? यहाँ एक जावास्क्रिप्ट उदाहरण (हालांकि मुझे पता है तुम js उपयोग नहीं कर रहे हैं),:

function Examp() { 
 
    var uString = "猫机+猫+猫ymg+sah猫"; 
 
    var plussed = uString.replace(/(.)(?=[\+\*])/ig,"($1)"); 
 
    console.log("Starting with string: " + uString + "\r\n" + "Result: " + plussed); 
 
    uString = "猫机+猫*猫ymg+s\\a+I+h猫"; 
 
    plussed = uString.replace(/(\\?.)(?=[\+\*])/ig,"($1)"); 
 
    console.log("You can even take this a step further and account for a character being escaped, if that's a consideration.") 
 
    console.log("Starting with string: " + uString + "\r\n" + "Result: " + plussed); 
 
}
<input type="button" value="Run" onclick="Examp()" />

0

वहाँ झंडा के लिए एक रास्ता एक पैटर्न या स्ट्रिंग के रूप में UTF8 वर्ण युक्त मिलान करने के लिए है?

मुझे लगता है कि LC_CTYPE वातावरण चर (या अन्य संबंधित स्थान सेटिंग) way to make regcomp/regexec understand your encoding है।

कम से कम grep प्रोग्राम इसे ध्यान में रखता है, जैसा कि https://stackoverflow.com/a/40809461/94687 में दिखाया गया है; मैंने regcomp फ़ंक्शन के साथ इसका परीक्षण नहीं किया है।

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