2010-05-12 7 views

Antwort

25
str.match(/\w+|"[^"]+"/g) 

//single, words, "fixed string of words" 
+3

scheint dies auf '.' und '-' sowie Leerzeichen. Das sollte wahrscheinlich 'str.match sein (/ \ S + |" [^ "] +"/g) ' – Awalias

+0

Es gibt ein anderes Problem damit, wenn es gematchte Zitate behandeln muss. Zum Beispiel: ' 'einzelne Wörter "behoben Zeichenkette von "zitierten" Wörtern " Sogar mit der Korrektur von Awalias gibt es: ' ["single", "words", "" fixed "," string "," "of", "words ""] ' Sie müssen mit Escape-Anführungszeichen umgehen, aber nicht stolpern und Backslash und entziehen. Ich denke, dass es irgendwann komplizierter wird, als Sie es wirklich mit einer Regexp handhaben möchten. – jep

+0

@Awalias Ich habe eine bessere Antwort unten. Das Regex-Beispiel sollte eigentlich/[^ \ s "] + |" ([^ "] *)"/g sein. In Bereichen, in denen Sie zitiert werden, teilen Sie sich immer noch auf. Ich fügte eine Antwort hinzu, die das behebt und die Anführungszeichen aus den Ergebnissen entfernt, wie es das OP verlangt. – dallin

9

Dies verwendet eine Mischung aus Split und Regex-Matching.

Dies gibt das erwartete Ergebnis zurück, obwohl eine einzelne Regexp in der Lage sein sollte, alles zu tun.

// ["single", "words", "fixed string of words"] 

aktualisieren Und das ist die verbesserte Version des Verfahrens von St. Markus vorgeschlagen

var str = 'single words "fixed string of words"'; 
var aStr = str.match(/\w+|"[^"]+"/g), i = aStr.length; 
while(i--){ 
    aStr[i] = aStr[i].replace(/"/g,""); 
} 
// ["single", "words", "fixed string of words"] 
+0

danke, ich gehe für die verbesserte Version – Remi

+0

Es gibt ein Problem mit der verbesserten Version, wo, wenn Sie ein Nicht-Wort-Zeichen wie "#" verwenden, wird es verschwinden. – tuhoojabotti

+0

Dies ist eine gute Antwort, aber wenn Sie alles über Regex tun wollen und die Anführungszeichen entfernt haben, habe ich eine neue Antwort hinzugefügt, die dies tut und nicht jedes Ergebnis durchlaufen muss, um die Anführungszeichen anschließend auszublenden. – dallin

0

ich die verschwindenden Zeichen bemerkt, auch. Ich denke, Sie können sie einschließen - zum Beispiel, um "+" mit dem Wort zu enthalten, verwenden Sie etwas wie "[\ w \ +]" statt nur "\ w".

13

Die angenommene Antwort ist nicht ganz korrekt. Es trennt sich auf Nicht-Leerzeichen wie. und - und hinterlässt die Zitate in den Ergebnissen. Der bessere Weg, dies zu tun, so dass sie die Zitate ausschließt, ist mit der Erfassung der Gruppen, wie solche:

//The parenthesis in the regex creates a captured group within the quotes 
var myRegexp = /[^\s"]+|"([^"]*)"/gi; 
var myString = 'single words "fixed string of words"'; 
var myArray = []; 

do { 
    //Each call to exec returns the next regex match as an array 
    var match = myRegexp.exec(myString); 
    if (match != null) 
    { 
     //Index 1 in the array is the captured group if it exists 
     //Index 0 is the matched text, which we use if no captured group exists 
     myArray.push(match[1] ? match[1] : match[0]); 
    } 
} while (match != null); 

myArray jetzt genau enthält, was der OP gefragt:

single,words,fixed string of words 
+0

Funktioniert gut, danke. Nur um zu sagen, dass der "ich" Schalter überflüssig ist. –

1

ES6 Lösung unterstützen:

  • Split durch Raum mit Ausnahme von innen zitiert
  • Entfernen zitiert, aber nicht für entgangenen Backslash Anführungszeichen
  • Entkommen Zitat geworden Zitat
  • Kann überall in Anführungszeichen setzen

Code:

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 

Ausgang:

[ 'single', 'words', 'fixed string of words' ] 
Verwandte Themen