2015-12-25 11 views
6

मैं निम्नलिखित regex की कोशिश की, लेकिन यह सब दोहरे उद्धरण चिह्नों मेल खाता है:दो डबल कोट्स के अंदर डबल कोट्स से मिलान करने का कोई तरीका है?

"[\"my cars last night\", 
\"Burger\",\"Decaf\" shirt\", 
\"Mocha\",\"marshmallows\", 
\"Coffee Mission\"]" 

पैटर्न मैं मिलान करना चाहते हैं के बीच दोहरे उद्धरण है:

(?>(?<=(")|))"(?(1)(?!")) 

यहाँ पाठ का एक नमूना है line 2

+1

हो सकता है कि [(?! <\ रों * [[,] \ s *) (?! [, \]]) '" '] (http://regexstorm.net/tester?p=(%3f%3c!%5cs*%5b%5b%2c%5d%5cs*)%22(%3f!%5b%2c%5c%5d%5d) और मैं =% 5 ब% 22my + कारों + पिछले + रात% 22% 2c% 0 d% 0A% 22Burger% 22% 2c% 22Decaf% 22 + शर्ट% 22% 2c% 0 d% 0A% 22Mocha% 22% 2c% 22marshmallows% 22% 2 सी% 0 डी% 0 ए% 22 कॉफी + मिशन% 22% 5 डी और आर =) –

+0

@stribizhev बहुत बहुत धन्यवाद। यह आपके द्वारा पंक्तिबद्ध नियमित अभिव्यक्ति साइट के लिए एक आकर्षण की तरह काम करता है, लेकिन जब मैं इसे अपने रूबी कोड में आज़माता हूं तो यह अलग-अलग काम करता है और यह इसे नहीं उठाता है। मुझे लगता है कि रेगेक्स में अलग-अलग वाक्य हैं इसे मैच करने के लिए रूबी के लिए कुल्हाड़ी। – 0bserver07

उत्तर

4

सामान्य नियम के रूप में, मैं कहूंगा: कोई

\"Burger\" \"Decaf\" shirt\" 

आप कैसे तय करते हैं जो \" ज़रूरत से ज़्यादा (गैर मिलान) है:

एक स्ट्रिंग को देखते हुए? Burger के बाद यह Decaf या shirt के बाद एक है? या इनमें से किसी भी शब्द से पहले? मेरा मानना ​​है कि पसंद मनमानी है।

हालांकि में आपका विशेष उदाहरण ऐसा लगता है कि आप सभी \" चाहते हैं जो अल्पविराम के नजदीक नहीं हैं।

इनमें निम्नलिखित regexp से पाया जा सकता है:

(?<!^)(?<![,\[])\\"(?![,\]]) 

हम \\" केंद्र में (दोहरे उद्धरण के बाद बैकस्लैश) के साथ शुरू करते हैं।

फिर हम कॉमा या क्लोजिंग स्क्वायर ब्रैकेट के बाद वाले सभी मैचों को त्यागने के लिए नकारात्मक लुकहेड का उपयोग करते हैं।

फिर हम अल्पविराम या उद्घाटन ब्रैकेट के बाद होने वाले सभी मैचों को त्यागने के लिए नकारात्मक दिखने का उपयोग करते हैं।

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

(पर्ल में) प्रमाण:

$ cat test 
"[\"my cars last night\", 
\"Burger\",\"Decaf\" shirt\", 
\"Mocha\",\"marshmallows\", 
\"Coffee Mission\"]" 
$ perl -n -e '$_ =~ s/(?<!^)(?<![,\[])\\"(?![,\]])/|||/g; print $_' test 
"[\"my cars last night\", 
\"Burger\",\"Decaf||| shirt\", 
\"Mocha\",\"marshmallows\", 
\"Coffee Mission\"]" 
+0

धन्यवाद @ मिरोस्लाव जेलवेस्की, यह काम करता है और विवरण यह समझने में बहुत उपयोगी है कि मैं पैटर्न से क्या खो रहा था। मैंने एक ही मुद्दा सोचा, लेकिन यह 3 अन्य अजीब पैटर्न की तरह हल करने के बाद है। – 0bserver07

1

मान लेते हैं कि अपने स्ट्रिंग का स्वरूप इस तरह होना चाहिए करते हैं:

["item1", "item2", ... "itemN"] 

तरह से करता है, तो एक दोहरे उद्धरण एक बंद दोहरे उद्धरण है पता करने के लिए यह जांचना है कि उसके बाद कॉमा या क्लोजिंग स्क्वायर ब्रैकेट होता है या नहीं। डबल कोट्स द्वारा संलग्न डबल कोट खोजने के लिए, आपको शुरुआत से सभी अप्रत्याशित वस्तुओं से एक अप्रत्याशित उद्धरण तक मिलान करना होगा।

उदाहरण पहले संलग्न बोली लगाने के लिए (यदि वह मौजूद):

(?:"[^"]*",\s*)*+"[^"]*\K" 

demo

लेकिन यह सब स्ट्रिंग में केवल एक ही संलग्न बोली के लिए काम करता है और उपयोगी नहीं है यदि आप चाहते हैं उन सभी को खोजें।

सभी उद्धरण खोजने के लिए:

(?:\G(?!\A)|(?:\A[^"]*|[^"]*",\s*)(?:"[^"]*",\s*)*+")[^"]*\K"(?!\s*[\],]) 

demo

+0

बहुत धन्यवाद @ कैसर! बहुत उपयोगी भी! – 0bserver07

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