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

    Javascript içinde bir dizgeyi boşluk ("") ile bölme, tırnak ifadesinin içindeki alanı göz ardı etme konusunda yardıma ihtiyacım var. Benim dize 2'ye bölünmesi beklenebilirjavascript boşluk ile bölünmüş dize, ancak boşluklarda yoksay (tırnak tarafından da bölünmemeye dikkat edin)

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

    :

    Ben bu dizesi vardır

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

    ama benim kod 4'e böler:

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

    şudur kodum:

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

    Teşekkürler!

    +0

    bağlantılı soru _related_ iken _not_ duplicate: _This_ soru, doğrudan double-qu'e bitişik olan dizeleri olmayan dizeleri istiyor. dizeleri (örneğin, foo: "bar none" ') bir _single_ belirteci olarak tanınması (ve aynı zamanda çift tırnak işaretleriyle başa çıkma gerekliliğinden bahsetmez.) – mklement0

    cevap

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

    Açıklaması:

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

    orijinal ifadeyi düzeltmek için, çıkıyor, sadece grup bir + eklemek gerekir:

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

    Düzenli olarak açıkladıysanız bu iyi bir yanıt olur. ifadesi. –

    +0

    sadece önce oraya götürün. – kch

    +0

    Teşekkürler! Eserleri! ve süper hızlı cevap :-) – user1986447

    0

    ES6 çözüm destekleyen:

    • f veya içinde
    • Çıkarma tırnak tırnak ancak ters eğik çizgi kaçan tırnak için
    • Kaçan alıntı haline alıntı

    Kodu:

    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 
    

    Çıktı:

    [ 'Time:Last 7 Days', 'Time:Last 30 Days' ] 
    
    İlgili konular