2012-11-27 19 views
7

में एम्बेडेड उद्धृत स्ट्रिंग से मिलान करने के लिए नियमित अभिव्यक्ति मेरे पास एक डेटा स्रोत है जो अल्पविराम-सीमित है, और उद्धरण योग्य है। एक सीएसवी हालांकि, डेटा स्रोत प्रदाता कभी-कभी कुछ भद्दा चीजें करता है। मैंने सभी के लिए मुआवजा दिया है, लेकिन उनमें से एक (हम फ़ाइल लाइन-बाय-लाइन में पढ़ते हैं, फिर इसे साफ करने के बाद इसे वापस लिखते हैं), और मैं आखिरी शेष समस्या को हल करने के लिए देख रहा हूं जब मेरा रेगेक्स-फु बहुत कमजोर है ।एक अन्य उद्धृत स्ट्रिंग

एक और उद्धरित स्ट्रिंग

तो यहाँ के अंदर एक उद्धरित स्ट्रिंग मिलान हमारे उदाहरण स्ट्रिंग ...

"foobar", 356, "Lieu-dit "chez Métral", Chilly, FR", "-1,000.09", 467, "barfoo", 1,345,456,235,231, "935.18" 

मैं सबस्ट्रिंग "Chez Métral" मैच के लिए देख रहा हूँ, में है इसे चेज़ मेटरल के साथ प्रतिस्थापित करने के लिए ऑर्डर करें। आदर्श रूप में, संभवतः कोड की कुछ पंक्तियों में। अंतिम लक्ष्य पहले से किए गए प्रतिस्थापन के साथ लाइन को वापस लिखना है (या इसे विधि वापसी मान के रूप में वापस करना)।

तो हमारे उदाहरण स्ट्रिंग डेटाबेस डेवलपर के रूप में अंत होगा ...

"foobar", 356, "Lieu-dit chez Métral, Chilly, FR", "-1,000.09", 467, "barfoo", 1,345,456,235,231, "935.18" 

मैं जानता हूँ कि मैं उद्धृत तार मिलान करने के लिए इस तरह के (?<quotedstring>\"\w+[^,]+\") के रूप में एक पैटर्न निर्धारित कर सकते हैं, लेकिन मेरे regex फू कमजोर है (, लगभग कभी नहीं सी # का उपयोग करें), इसलिए मुझे यकीन नहीं है कि नामित समूह उद्धृत नामित किसी अन्य उद्धृत स्ट्रिंग से मिलान कैसे करें।


FYI करें: बड़ा पूर्णांक है कि अल्पविरामों से स्वरूपित किया गया है, लेकिन बोली-योग्य नहीं देख उन लोगों के लिए, जो पहले से ही संभाला है। पंक्ति-डिलीमीटर (कभी-कभी सीआर, कभी-कभी एलएफ) का यादृच्छिक उपयोग होता है। अन्य समस्याओं के रूप में ...

+1

ऐसा लगता है कि आपके पास CSV फ़ाइल में बहुत बुरी तरह से गठित प्रयास है (यह वैध CSV नहीं है)। Regex इसके लिए एक अच्छा समाधान होने की संभावना नहीं है। – Oded

+1

ए -> "ए" | ए एक सीएफ व्याकरण है और नियमित अभिव्यक्तियों के साथ सही ढंग से मिलान नहीं किया जा सकता है। – fardjad

+0

एम्बेडेड कॉमा और "अन्य समस्याएं" आप कैसे पहले से ही "हैंडलिंग" कर रहे हैं? क्या अतिरिक्त विधि उद्धृत करने के लिए यह वही विधि उपयोग की जा सकती है? –

उत्तर

4

इस regex

(?<!,\s*|^)"([^",]*)" 

साथ अब बदलें $1

से बदलने "" साथ " बचने यह

बन जाएगा यह here


कोशिश

(?<!,\s*|^)""([^"",]*)"" 
+0

ऐसा प्रतीत होता है कि उपर्युक्त पैटर्न ", 356," और "1,345,456,235,231" के साथ "चेज़ मेटरल" के अतिरिक्त भी मेल खाते हैं। –

+0

@TheLazyDBA यह उस तरह से प्रकट नहीं होता है cuz मैंने इसका परीक्षण किया है .. यह – Anirudha

+0

काम करता है क्या आपके लिए अपने उत्तर को और अधिक स्पष्ट करना संभव होगा? –

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