Domanda

mi aspetto questa linea di JavaScript:

"foo bar baz".match(/^(\s*\w+)+$/)

per tornare qualcosa di simile:

["foo bar baz", "foo", " bar", " baz"]

ma invece restituisce solo l'ultima partita catturato:

["foo bar baz", " baz"]

C'è un modo per ottenere tutte le partite catturate?

È stato utile?

Soluzione

Quando si ripete un gruppo di cattura, nella maggior parte dei sapori, solo l'ultima acquisizione è mantenuta; qualsiasi cattura precedente viene sovrascritto. In una variante, ad esempio NET, è possibile ottenere tutte le catture intermedi, ma questo non è il caso di Javascript.

Questo è, in Javascript, se si dispone di un modello con N gruppi di cattura, è possibile catturare solo esattamente N stringhe per partita, anche se alcuni di questi gruppi erano ripetuto.

Quindi in generale, a seconda di ciò che devi fare:

  • Se si tratta di un'opzione, per parti separate su delimitatori invece
  • Al posto di corrispondenza /(pattern)+/, forse abbinare /pattern/g, forse in un ciclo exec
    • Do atto che questi due non sono esattamente equivalenti, ma può essere un'opzione
  • Do corrispondenti a più livelli:
    • Cattura il gruppo ripetuto in una partita
    • Quindi eseguire un'altra espressione regolare per rompere quella partita a parte

Bibliografia


Esempio

Ecco un esempio di corrispondenza <some;words;here> in un testo, utilizzando un ciclo exec, e poi la divisione su ; per ottenere singole parole ( vedere anche su ideone.com ):

var text = "a;b;<c;d;e;f>;g;h;i;<no no no>;j;k;<xx;yy;zz>";

var r = /<(\w+(;\w+)*)>/g;

var match;
while ((match = r.exec(text)) != null) {
  print(match[1].split(";"));
}
// c,d,e,f
// xx,yy,zz

Il modello utilizzato è:

      _2__
     /    \
<(\w+(;\w+)*)>
 \__________/
      1

Questo corrisponde <word>, <word;another>, <word;another;please>, ecc gruppo 2 viene ripetuto per catturare qualsiasi numero di parole, ma può mantenere solo l'ultima cattura. L'intero elenco di parole viene catturato dal gruppo 1; questa stringa viene poi split sul delimitatore virgola.

Domande correlate

Altri suggerimenti

Come è su questo? "foo bar baz".match(/(\w+)+/g)

A meno che non si dispone di un requisito più complicato per come si sta dividere le corde, è possibile dividere, e poi restituire la stringa iniziale con loro:

var data = "foo bar baz";
var pieces = data.split(' ');
pieces.unshift(data);

provare a utilizzare 'g':

"foo bar baz".match(/\w+/g)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top