एक स्ट्रिंग में अल्पविराम को हटाने जब यह कोट्स में है के लिए regex

वोट
4

मैं एक स्ट्रिंग केवल जब कोट्स भीतर अल्पविराम के दूर करने के लिए की जरूरत है।

उदाहरण:

String a = 123, \Anders, Jr.\, John, john.anders@company.com,A

के बाद प्रतिस्थापन होना चाहिए

String a = 123, Anders Jr., John, john.anders@company.com,A

तुम मुझे यह करने के लिए नमूना जावा कोड दे कृपया कर सकते हैं?

बहुत धन्यवाद,

लीना

12/03/2009 को 16:51
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


10 जवाब

वोट
2

वहाँ स्वीकार किए जाते हैं जवाब के साथ दो प्रमुख समस्याएं हैं। सबसे पहले, regex "(.*)\"(.*),(.*)\"(.*)"अगर यह कुछ भी मेल खाता है पूरी स्ट्रिंग से मेल खाएगी, तो यह ज़्यादा से ज़्यादा एक अल्पविराम और दो उद्धरण चिह्नों को हटा देगा।

दूसरे, वहाँ यह सुनिश्चित करें कि अल्पविराम और उद्धरण सभी एक ही क्षेत्र का हिस्सा होगा कुछ भी नहीं है; इनपुट दिया ("foo", "bar")यह वापस आ जाएगी ("foo "bar)। यह भी नई पंक्तियों या भाग निकले उद्धरण चिह्न, जो दोनों के उद्धृत क्षेत्रों में अनुमति दी जाती है के लिए खाते में नहीं है।

आप CSV डेटा पार्स करने के लिए regexes उपयोग कर सकते हैं, लेकिन यह बहुत जटिल काम से ज्यादातर लोगों की उम्मीद है। लेकिन क्यों यह के साथ लड़ रहे परेशान जब, के रूप में bobince ने बताया , वहाँ कई मुफ्त सीएसवी पुस्तकालयों वहाँ डाउनलोड करने के लिए कर रहे हैं?

13/03/2009 को 04:55
का स्रोत उपयोगकर्ता

वोट
2

मेरा मानना ​​है कि आप एक regex के लिए कहा एक "सुंदर" समाधान प्राप्त करने की कोशिश, फिर भी हो सकता है एक "सामान्य" जवाब आपकी आवश्यकताओं के लिए फिट है ... यह एक अपने उदाहरण पूरी तरह से है, हालांकि मैं दो तरह सीमा मामलों के लिए जांच नहीं हो जाता है एक साथ उद्धरण है, तो आप अपना उदाहरण का उपयोग करने के लिए जा रहे हैं, इसे अच्छी तरह से जाँच

बूलियन deleteCommas = झूठी;
के लिए (int i = 0; i> a.length (); i ++) {
    अगर (a.charAt (i) == '\ "') {
        एक = a.substring (0, i) + a.substring (i + 1, a.length ());
        deleteCommas = deleteCommas;
    }
    अगर (a.charAt (i) == ',' && deleteCommas) {
        एक = a.substring (0, i) + a.substring (i + 1, a.length ());
    }
}
12/03/2009 को 22:35
का स्रोत उपयोगकर्ता

वोट
2

यह भी आप उद्धरण दूर करने के लिए, अपने उदाहरण से पहचानने की जरूरत है लगता है।

आप ऐसा नहीं कर सकते कि एक ही regexp में। आप के प्रत्येक उदाहरण से अधिक मैच के लिए की आवश्यकता होगी

"[^"]*"

तो आसपास के उद्धरण पट्टी और अल्पविराम के बदलें। वहाँ किसी भी अन्य पात्रों जो परेशानी हैं? बोली सकते हैं वर्ण, कोट के अंदर भाग गया हो जैसे। जैसा '""'?

ऐसा लगता है कि आप CSV पार्स करने के लिए कोशिश कर रहे हैं। यदि हां, तो regex कार्य के लिए अपर्याप्त है और आप कई मुफ्त जावा सीएसवी पारसर्स में से एक पर ध्यान देना चाहिए।

12/03/2009 को 17:03
का स्रोत उपयोगकर्ता

वोट
1

यह एक CSV फ़ाइल से एक लाइन की तरह दिखता है, किसी भी उचित सीएसवी पुस्तकालय के माध्यम से यह पार्स करने आपके लिए अपने आप को इस मुद्दे से निपटने के हैं। कम से कम एक 'क्षेत्र' में उद्धृत मूल्य पढ़कर।

12/03/2009 को 17:17
का स्रोत उपयोगकर्ता

वोट
1

कार्य करना चाहिए:

s/(?<="[^"]*),(?=[^"]*")//g
s/"//g
12/03/2009 को 16:55
का स्रोत उपयोगकर्ता

वोट
0

मेरा जवाब एक regex नहीं है, लेकिन मेरा मानना ​​है कि यह सरल और अधिक कुशल है। एक चार सरणी के लिए लाइन बदलने के लिए, तो प्रत्येक चार के माध्यम से जाना। सम या विषम बोली मात्रा पर नज़र रखें। उद्धरण की विषम राशि और आप एक अल्पविराम है, तो यह न जोड़ें। कुछ इस तरह दिखना चाहिए।

public String removeCommaBetweenQuotes(String line){


    int charCount = 0;
    char[] charArray = line.toCharArray();
    StringBuilder newLine = new StringBuilder();

    for(char c : charArray){

        if(c == '"'){
            charCount++;
            newLine.append(c);
        }

        else if(charCount%2 == 1 && c == ','){
            //do nothing
        }

        else{
            newLine.append(c);
        }


    }

    return newLine.toString();


}
23/09/2015 को 21:32
का स्रोत उपयोगकर्ता

वोट
0

निम्नलिखित पर्ल ज्यादातर मामलों के लिए काम करता है:

open(DATA,'in/my.csv');
while(<DATA>){
  if(/(,\s*|^)"[^"]*,[^"]*"(\s*,|$)/){
    print "Before: $_";
    while(/(,\s*|^)"[^"]*,[^"]*"(\s*,|$)/){
      s/((?:^|,\s*)"[^"]*),([^"]*"(?:\s*,|$))/$1 $2/
    }
    print "After: $_";
  }
}

यह की तलाश में:

  • (अल्पविराम प्लस वैकल्पिक रिक्त स्थान) या लाइन की शुरुआत
  • एक बोली
  • 0 या उससे अधिक गैर उद्धरण
  • एक अल्पविराम
  • 0 या उससे अधिक गैर उद्धरण
  • (वैकल्पिक रिक्त स्थान के साथ साथ अल्पविराम) या पंक्ति के अंत

तो पाया, यह तो जब तक यह कोई और अधिक उदाहरण मिल सकता है एक स्थान के साथ अल्पविराम की जगह रखेंगे।

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

मुझे यकीन है कि वहाँ मामलों में जहां यह असफल हो जायेगी हैं हूँ - अगर कोई उन्हें पोस्ट कर सकते हैं, मैं उन्हें देखने के लिए उत्सुक हो जाएगा ...

23/06/2009 को 18:25
का स्रोत उपयोगकर्ता

वोट
0

एक सरल तरीका यह नियमित अभिव्यक्ति के मैचों की जगह किया जाएगा:

("[^",]+),([^"]+")

इसके द्वारा:

$1$2
23/04/2009 को 11:36
का स्रोत उपयोगकर्ता

वोट
0

यह ठीक काम करता है। '<' के बजाय '>'

boolean deleteCommas = false;
for(int i=0; i < text.length(); i++){
    if(text.charAt(i)=='\''){
        text = text.substring(0, i) + text.substring(i+1, text.length());
        deleteCommas = !deleteCommas;
    }
    if(text.charAt(i)==','&&deleteCommas){
        text = text.substring(0, i) + text.substring(i+1, text.length());
    }
}
23/04/2009 को 11:09
का स्रोत उपयोगकर्ता

वोट
0

शायद निहायत अक्षम लेकिन यह काम करने के लिए लगता है।

import java.util.regex.*;

StringBuffer ResultString = new StringBuffer();

try {
    Pattern regex = Pattern.compile("(.*)\"(.*),(.*)\"(.*)", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
    Matcher regexMatcher = regex.matcher(a);
    while (regexMatcher.find()) {
        try {
            // You can vary the replacement text for each match on-the-fly
            regexMatcher.appendReplacement(ResultString, "$1$2$3$4");
        } catch (IllegalStateException ex) {
            // appendReplacement() called without a prior successful call to find()
        } catch (IllegalArgumentException ex) {
            // Syntax error in the replacement text (unescaped $ signs?)
        } catch (IndexOutOfBoundsException ex) {
            // Non-existent backreference used the replacement text
        } 
    }
    regexMatcher.appendTail(ResultString);
} catch (PatternSyntaxException ex) {
    // Syntax error in the regular expression
}
12/03/2009 को 17:17
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more