Come catturare un numero arbitrario di gruppi in JavaScript Regexp?
-
30-09-2019 - |
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?
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 cicloexec
- 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 ??li>
- Quindi eseguire un'altra espressione regolare per rompere quella partita a parte
Bibliografia
- regular-expressions.info/Repeating un gruppo di cattura contro l'acquisizione di un gruppo Ripetendo
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)