javascript atscript अंतरिक्ष से जावास्क्रिप्ट स्प्लिट स्ट्रिंग, लेकिन उद्धरणों में स्थान की अनदेखी करें(बृहदान्त्र द्वारा विभाजित नहीं करने का नोटिस भी)




जावास्क्रिप्ट इन भाषाओं से प्रेरित (2)

मुझे स्पेस ("") द्वारा जावास्क्रिप्ट में एक स्ट्रिंग बंटाने में मदद की ज़रूरत है, अभिव्यक्ति उद्धरण चिह्नों के अंदर अंतरिक्ष को अनदेखा कर रहा है

मेरे पास यह स्ट्रिंग है:

var str = 'Time:"Last 7 Days" Time:"Last 30 Days"';

मुझे उम्मीद है कि मेरी स्ट्रिंग 2 से विभाजित होगी:

['Time:"Last 7 Days"', 'Time:"Last 30 Days"']

लेकिन मेरा कोड 4 से विभाजित है:

['Time:', '"Last 7 Days"', 'Time:', '"Last 30 Days"']

यह मेरा कोड है:

str.match(/(".*?"|[^"\s]+)(?=\s*|\s*$)/g);

धन्यवाद!


s = 'Time:"Last 7 Days" Time:"Last 30 Days"'
s.match(/(?:[^\s"]+|"[^"]*")+/g) 

// -> ['Time:"Last 7 Days"', 'Time:"Last 30 Days"']

व्याख्या की:

(?:         # non-capturing group
  [^\s"]+   # anything that's not a space or a double-quote
  |         #   or…
  "         # opening double-quote
    [^"]*   # …followed by zero or more chacacters that are not a double-quote
  "         # …closing double-quote
)+          # each match is one or more of the things described in the group

अपनी मूल अभिव्यक्ति को ठीक करने के लिए, बाहर निकले, आपको सिर्फ समूह पर + जोड़ना होगा:

str.match(/(".*?"|[^"\s]+)+(?=\s*|\s*$)/g)
#                         ^ here.

ES6 समाधान का समर्थन:

  • अंतराल को छोड़कर अंतरिक्ष द्वारा विभाजित करें
  • अवतरणों को निकालना, लेकिन बैकस्लैश के लिए उद्धरण नहीं छोड़े गए
  • बच निकला बोली बोली

कोड:

str.match(/\\?.|^$/g).reduce((p, c) => {
        if(c === '"'){
            p.quote ^= 1;
        }else if(!p.quote && c === ' '){
            p.a.push('');
        }else{
            p.a[p.a.length-1] += c.replace(/\\(.)/,"$1");
        }
        return  p;
    }, {a: ['']}).a

आउटपुट:

[ 'Time:Last 7 Days', 'Time:Last 30 Days' ]






split