2015-12-11 4 views
5

मेरे पास निम्न रेगेक्स है जिसमें 3 विकल्प हैं ( से नीचे संपूर्ण रेगेक्स देखें), प्रत्येक के अपने उपसर्ग और प्रत्यय वर्ण हैं। मुझे लगता है कि यह अत्यधिक दोहराया जा रहा है और यदि संभव हो तो इसे सरल बनाना चाहते हैं। मैं उन मानों को प्रतिस्थापित करने के लिए अनुचित रूप से गठित JSON स्ट्रिंग में मूल्यों से मेल खाता हूं जिनके पास अनुक्रमित कुंजी के साथ कोई कुंजी नहीं है।विभिन्न उपसर्ग और प्रत्यय अभिव्यक्तियों के साथ साझा उप अभिव्यक्ति के साथ रेगेक्स परिवर्तन

प्रत्येक विकल्प उप अभिव्यक्ति के साथ उपसर्ग और प्रत्यय जोड़ी से मेल खाना चाहिए। मेरे पास इस समय 3 जोड़े हैं, लेकिन यह बदल सकता है। अगर मेरे पास कई और जोड़े थे तो पूरे रेगेक्स को संशोधित करने और समझने के लिए एक दुःस्वप्न बन जाएगा यदि मुझे बार-बार उप अभिव्यक्ति को संशोधित करने की आवश्यकता है।

प्रश्न

मैं कैसे पूरे regex नीचे प्रत्यय और उपसर्ग की सूचीबद्ध जोड़े के लिए उप अभिव्यक्ति दोहराने की जरूरत के बिना छोटा हो सकता है?

उप अभिव्यक्ति,

("(?:[^\\"]+|\\.)*") 

उपसर्ग/प्रत्यय जोड़े

  1. प्रत्येक प्रत्यावर्तन में दोहराया {,
  2. ,,
  3. ,}

पूरे Regex

/\{("(?:[^\\"]+|\\.)*")(?=,)|,("(?:[^\\"]+|\\.)*")(?=,)|,("(?:[^\\"]+|\\.)*")(?=\})/g 

टेस्ट स्ट्रिंग्स

  • {"trailer":"","pallet":"A","date":"11-Dec-15","c","z","a"}
  • {"trailer":"","pallet":"A","a","date":"11-Dec-15"}
  • {"a","trailer":"","pallet":"A","date":"11-Dec-15"}
  • {"a","trailer":"","pallet":"A","date":"11-Dec-15","z\""}
  • {"trailer":"","pallet":"A","11-Dec-15"}
  • {"trailer\"","pallet":"A","11-Dec\"-15","z\""}

Live Example

alternations और नहीं JSON मान्यता तकनीक के रूप में मैं regex का एक बेहतर समझ हासिल करने के लिए कोशिश कर रहा हूँ regex के जवाब को सीमित करने और यह सिर्फ उदाहरण है कि मैं उपयोग कर रहा है कृपया ।

/\{("(?:[^\\"]+|\\.)*")(?=,)|,("(?:[^\\"]+|\\.)*")(?=,)|,("(?:[^\\"]+|\\.)*")(?=\})/g 

करने के लिए::

+1

आप 'RegExp' निर्माता के साथ गतिशील regex इमारत का उपयोग कर सकते हैं: घोषित' ("(? [^ \\"।] | \\) * ")' एक निर्माण खंड चर के रूप में, और फिर बस इसे पुन: उपयोग पैटर्न में। आपको सभी बैकस्लैश को दोगुना करना होगा। –

+0

यदि मुझे गलत समझा नहीं गया है, तो आप केवल एक से अधिक अभिव्यक्तियों का उपयोग करके सभी भागों को मिलान करने के लिए (एकाधिक) एक से अधिक अभिव्यक्तियों का उपयोग कर सकते हैं। प्रत्येक मामले में वैध परिसीमन पात्रों में से या तो मेल खाते हैं। – bitifet

+0

@bitifet मैं इस से पहले की कोशिश की थी लेकिन पता चला है कि आप एक lookbehind भीतर भाव उपयोग नहीं कर सकते तो मैं मुश्किल कोड के लिए प्रत्येक घटना के लिए होगा। यही कारण है कि अभी भी मुझे हर किरदार निर्दिष्ट किए छोड़ देता है कि मैं इच्छा है। तो या तो मुझे जावास्क्रिप्ट स्ट्रिंग का उपयोग करके अपना रेगेक्स उत्पन्न करना होगा या RegExp फ़ंक्शन का उपयोग करना होगा जो ऐसा करने के लिए प्रतीत होता है। – pcnate

उत्तर

1

नियमित अभिव्यक्ति जबकि से सरल किया जा सकता

/{("(?:[^\\"]+|\\.)*")(?=,)|,("(?:[^\\"]+|\\.)*")(?=,)|,("(?:[^\\"]+|\\.)*")(?=})/g 

{ और } की एस्केपिंग निकाला जा रहा है के रूप में यह जावास्क्रिप्ट के regex इंजन के लिए आवश्यक नहीं है।

यह जावास्क्रिप्ट में आपकी स्पष्ट दोहराया पैटर्न ("(?:[^\\"]+|\\.)*") दूर करने के लिए संभव नहीं है।

जावास्क्रिप्ट आधारित सभी एक ही नियमित अभिव्यक्ति कार्यक्षमता PCRE का समर्थन नहीं नहीं करता है (PHP, सी ++, पर्ल, आदि) regex इंजन का समर्थन करता है।

पीएचपी/सी में उदाहरण ++ आप ऐसा कर सकता है के लिए:

m/\{("(?:[^\\"]+|\\.)*")(?=,)|,((?1))(?=,)|,((?1))(?=})/g 

यह (?1):

{("(?:[^\\"]+|\\.)*")(?=,)|,((?1))(?=,)|,((?1))(?=}) 

पर्ल 5.22 के लिए आपको लगता है कि { फिर तो यह कुछ इस तरह दिखेगा से बचने के लिए की आवश्यकता होगी एक सबरूटीन कॉल समूह 1 जो इस मामले में ("(?:[^\\"]+|\\.)*") है पर कब्जा करने के अंदर रेगुलर एक्सप्रेशन से मेल करने के लिए है।

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