javascript
  • regex
  • split
  • 2013-04-28 13 views 22 likes 
    22

    Ho bisogno di aiuto per dividere una stringa in javascript dallo spazio (""), ignorando lo spazio all'interno delle virgolette espressione.javascript dividere la stringa per spazio, ma ignorare lo spazio tra virgolette (notare di non dividere per i due punti)

    ho questa stringa:

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

    mi aspetto la mia stringa da dividere per 2:

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

    ma il mio codice si divide per 4:

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

    questo è il mio codice:

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

    Grazie!

    +0

    Mentre la questione collegata è _related_ , è _non_ un duplicato: _Questa domanda richiede esplicitamente stringhe non quotate che si aggiungono direttamente al doppio qu stringhe oted (ad esempio, 'foo:" bar none "') per essere riconosciuto come un token _single_ (e inoltre non menziona la necessità di gestire le doppie virgolette.) – mklement0

    risposta

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

    spiegato:

    (?:   # 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 
    

    scopre, per riparare la vostra espressione originale, è sufficiente aggiungere un + sul gruppo:

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

    Questa sarebbe una buona risposta se si spiegasse il regolare espressione. –

    +0

    appena uscito prima lì. – kch

    +0

    Grazie !!! lavori! e super veloce risposta :-) – user1986447

    0

    ES6 soluzione di supporto:

    • Diviso per lo spazio tranne f o all'interno cita
    • citazioni rimozione, ma non per le citazioni fuggiti backslash
    • Fuggito citazione diventare citazione

    Codice:

    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 
    

    uscita:

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