2010-04-23 15 views
5

द्वारा घिरा हुआ एक अल्पविराम से मेल खाने के लिए एक रेगेक्स, मैं क्लोजर का उपयोग कर रहा हूं, इसलिए यह जावा रेगेक्स के संदर्भ में है।उद्धरण

{:a "ab,cd, efg", :b "ab,def, egf,", :c "Conjecture"} 

महत्वपूर्ण बिट्स प्रत्येक स्ट्रिंग के बाद अल्पविराम के हैं:

यहाँ एक उदाहरण स्ट्रिंग है। मैं जावा की प्रतिस्थापन सभी विधि के साथ उन्हें नए अक्षरों के साथ प्रतिस्थापित करने में सक्षम होना चाहता हूं। एक रेगेक्स जो से मेल खाता है अल्पविराम जो उद्धरण से घिरा नहीं है।

यदि मैं अच्छी तरह से नहीं आ रहा हूं, तो कृपया पूछें और मैं कुछ भी स्पष्ट करने के लिए खुशी से रहूंगा।

संपादित करें: शीर्षक में भ्रम के लिए खेद है। मैं बहुत लंबे समय तक जाग नहीं रहा हूं।

स्ट्रिंग: {:a "ab, cd efg",} < - इस उदाहरण में, अंत में अल्पविराम मिलान किया जाएगा, लेकिन उद्धरण के अंदर वाले लोग नहीं होंगे।

स्ट्रिंग: {:a 3, :b 3,} < - प्रत्येक एकल कॉमा मैच।

स्ट्रिंग {:a "abcd,efg" :b "abcedg,e"} < - प्रत्येक एकल कॉमा मेल नहीं खाता है।

+0

क्या आप एक उदाहरण जोड़ सकते हैं जहां प्रत्येक एकल कॉमा मैच होता है, और एक जहां प्रत्येक एकल कॉमा – mkoryak

उत्तर

18

regex:

,\s*(?=([^"]*"[^"]*")*[^"]*$) 

से मेल खाता है:

{:a "ab,cd, efg", :b "ab,def, egf,", :c "Conjecture"} 
       ^    ^
       ^    ^

और:

{:a "ab, cd efg",} 
       ^
       ^

और में एक अल्पविराम से मेल नहीं खाता:

{:a "abcd,efg" :b "abcedg,e"} 

लेकिन जब बच गए उद्धरण, तो तरह दिखाई कर सकते हैं:

{:a "ab,\" cd efg",} // only the last comma should match 

तो एक regex समाधान काम नहीं करेगा।

regex का एक संक्षिप्त विवरण:

,   # match the character ',' 
\s*   # match a whitespace character: [ \t\n\x0B\f\r] and repeat it zero or more times 
(?=   # start positive look ahead 
    (   # start capture group 1 
    [^"]* #  match any character other than '"' and repeat it zero or more times 
    "  #  match the character '"' 
    [^"]* #  match any character other than '"' and repeat it zero or more times 
    "  #  match the character '"' 
)*   # end capture group 1 and repeat it zero or more times 
    [^"]*  # match any character other than '"' and repeat it zero or more times 
    $   # match the end of the input 
)   # end positive look ahead 

दूसरे शब्दों में: किसी भी अल्पविराम शून्य है, या एक भी इसके बारे में आगे उद्धरण की संख्या (स्ट्रिंग के अंत तक) मेल खाते हैं।

+0

से मेल नहीं खाता है, ऐसा लगता है कि आपने जो चाहते थे उसके विपरीत किया था। : पी मैं उन अल्पविरामों से मेल खाना चाहता हूं जो स्ट्रिंग में/नहीं हैं। :) – Rayne

+0

आह, चूंकि आप अपनी स्ट्रिंग के अंदर उद्धरण से बच नहीं पाए, इसलिए मैंने माना कि पहला और अंतिम उद्धरण आपके शाब्दिक का हिस्सा भी था। मेरा regex अभी भी सही है, बीटीडब्ल्यू। मेरा संपादन देखें। –

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