var str = 'single words "fixed string of words"';
var astr = str.split(" "); // need fix
Voglio che l'array sia come: singolo, parole, stringa fissa di parole.javascript dividere la stringa sullo spazio o tra virgolette sull'array
var str = 'single words "fixed string of words"';
var astr = str.split(" "); // need fix
Voglio che l'array sia come: singolo, parole, stringa fissa di parole.javascript dividere la stringa sullo spazio o tra virgolette sull'array
str.match(/\w+|"[^"]+"/g)
//single, words, "fixed string of words"
Questo utilizza un mix di suddivisione e regex matching.
var str = 'single words "fixed string of words"';
var matches = /".+?"/.exec(str);
str = str.replace(/".+?"/, "").replace(/^\s+|\s+$/g, "");
var astr = str.split(" ");
if (matches) {
for (var i = 0; i < matches.length; i++) {
astr.push(matches[i].replace(/"/g, ""));
}
}
Questo restituisce il risultato previsto, anche se una singola espressione regolare dovrebbe essere in grado di eseguire tutto.
// ["single", "words", "fixed string of words"]
Aggiornamento e questa è la versione migliorata del metodo proposto da S. Marco
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"]
grazie, vado per la versione migliorata – Remi
C'è un problema con la versione migliorata, dove se usi un carattere non di parole come "#" scomparirà. – tuhoojabotti
Questa è una buona risposta, ma se si desidera eseguire tutto tramite espressioni regolari e rimuovere le virgolette, ho aggiunto una nuova risposta che esegue questa operazione e non richiede il looping di ogni risultato per rimuovere le virgolette in seguito. – dallin
ho notato i personaggi scompaiono, anche. Penso che puoi includerli - per esempio, per includere "+" con la parola, usa qualcosa come "[\ w \ +]" invece di "\ w".
La risposta accettata non è del tutto corretta. Si separa su personaggi non spaziali come. e - e lascia le virgolette nei risultati. Il modo migliore per farlo in modo tale che esso esclude le quotazioni è con gruppi di cattura, come ad esempio:
//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 ora conterrà esattamente ciò che il PO ha chiesto:
single,words,fixed string of words
Funziona bene, grazie. Solo per dire che l'opzione "i" sembra essere ridondante. –
Qui potrebbe essere un completo soluzione: https://github.com/elgs/splitargs
ES6 soluzione supporto:
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:
[ 'single', 'words', 'fixed string of words' ]
questo sembra dividere in "." e '-' così come gli spazi. Questo dovrebbe probabilmente essere 'str.match (/ \ S + |" [^ "] +"/g) ' – Awalias
C'è un altro problema con questo, se deve gestire le virgolette con escaping. Ad esempio: ' 'singole parole "risolto stringa di \ "quoted \" words "'' Anche con la correzione di Awalias, questo dà: '[" singolo "," parole "," "fisso", "stringa", "" di "," parole ""] ' Avresti bisogno di gestire le virgolette con escape, ma non di inciampare e afferrare e far uscire la barra rovesciata. Penso che alla fine diventerà più complicato di quello che vorresti veramente gestire con un'espressione regolare. – jep
@Awalias Ho una risposta migliore qui sotto. Il tuo esempio di espressione regolare dovrebbe essere/[^ \ s "] + |" ([^ "] *)"/g. Il tuo sarà ancora diviso in spazi in aree quotate. Ho aggiunto una risposta che risolve questo problema e rimuove le virgolette dai risultati come richiesto dall'OP. – dallin