regex - QRegexp idiosyncracies (compared to perl): How can I write this regexp without the lazy quantifier? -
मेरे पास निम्न नियमित अभिव्यक्ति है जो perl में ठीक काम करती है:
वर्गीकरण: \ s ([^ \ N] +?) (?: \ S श्रेणी: \ s ([^ \ n] +?)) * (?: \ S संरचनात्मक वफ़ादारी: \ s ([^ \ n] +)) * \ n < / कोड> डेटा स्ट्रिंग के प्रकार इस स्ट्रिंग के खिलाफ मैच माना जाता है:
वर्गीकरण: कक्षा नाम रेंज: xxxx स्ट्रक्चरल वफ़ादारी: मूल्य वर्गीकरण: कक्षा नाम स्ट्रक्चरल वफ़ादारी: मूल्य वर्गीकरण: क्लास नेम
यही है: "रेंज" और "स्ट्रक्चरल इंटिग्रिटी" फ़ील्ड वैकल्पिक हैं। इसलिए इच्छित परिणाम है:
{$ & amp; [वर्गीकरण: वर्ग नाम श्रेणी: xxxx स्ट्रक्चरल वफ़ादारी: मूल्य] $ 1 [कक्षा का नाम] $ 2 [xxx] $ 3 [मूल्य] $ & amp; [वर्गीकरण: कक्षा नाम संरचनात्मक वफ़ादारी: मूल्य] $ 1 [कक्षा का नाम] $ 2 [मूल्य] $ & amp; [वर्गीकरण: वर्ग का नाम] $ 1 [वर्ग का नाम]}
अभिव्यक्ति का उपयोग करता है? आलसी क्वांटिफायर दो जगहों पर। इस ऑपरेटर को QRegExp द्वारा समर्थित नहीं है, इसके बजाय Qt "न्यूनतम" प्रॉपर्टी का उपयोग करता है, जो सही पर सेट होता है, non-redy
अभिव्यक्ति में सभी इस जानकारी के साथ सशस्त्र मैं अपना कोड लिखता हूं:
QRegExp rx ("वर्गीकरण: \\ s ([^ \ \ n] +) (?: \\ sRange: \\ s ([^ \\ n] +)) * (?: \\ संरचनात्मक वफ़ादारी: \\ s ([^ \ \ n] +)) * \\ n "); rx.setMinimal (सही);
लेकिन परिणाम गलत हैं, और बहुत tweaking के बाद मैं सही कब्जा प्राप्त करने में सक्षम नहीं किया गया है। क्या यह इसे अधिक कोड और कम regex में विभाजित करना संभव है? या आलसी ऑपरेटर के बिना इसे फिर से लिखना है?
ऐसा कुछ:
< कोड> QRegExp आरएक्स ("(वर्गीकरण | श्रेणी | संरचनात्मक \\ s + वफ़ादारी): | (\\ S +)"); QStringList वर्गीकरण (); QStringList रेंज (); कस्टस्ट्रेलिस्ट अखंडता (); QStringList वर्तमान = नल; Int pos; जबकि ((pos = rx.indexIn (str, pos)) = -1) {if (rx.cap (1) == नल) {if (current! = Null) {current & lt; & lt; rx.cap (2); }} और यदि ("वर्गीकरण" .equals (rx.cap (1))) {वर्तमान = वर्गीकरण; } और यदि ("रेंज" .equals (rx.cap (1))) {current = range; } और अगर ("स्ट्रक्चरल इंटिग्रिटी" .एक्वायल्स (rx.cap (1))) {वर्तमान = अखंडता; } Pos + = rx.matchedLength (); }
यह किसी भी योग्य कुंजी के साथ मेल खाता है जो एक बृहदान्त्र या शब्द हैं। अगर यह एक कुंजी है, तो वर्तमान सूची को संबंधित एक में बदलें। अन्यथा मौजूदा सूची में शब्द जोड़ें।
अंत में, आपके पास सूचियाँ वर्गीकरण
, श्रेणी
और अखंडता होगा
, इसी कुंजी के बाद शब्दों को युक्त। पूर्ण मिलान के बाद आप उनसे जुड़ सकते हैं:
कस्टस्ट्रिंग वर्गीकरण स्ट्रिंग = वर्गीकरण। ("");
हालांकि इसकी कुंजी के क्रम की परवाह नहीं है।
Comments
Post a Comment