Diciamo che avevo una stringa "QQxaxbxcQQ" e iovoleva catturare tutti i gruppi di x seguiti da qualsiasi carattere. Voglio anche solo cercare tra i QQ "(la stringa potrebbe includere altre cose in esso). Ho pensato che avrebbe funzionato:
var matches = str.match(/QQ(xw)+QQ/)
Tuttavia, questo sembra solo tornare a me l'ultima partita (xc). Puoi indicarmi la giusta direzione?
EDIT: la prima versione della mia domanda è stata semplificata. Mi scuso con i risponditori originali. Modificato per renderlo più vicino al mio problema reale.
risposte:
1 per risposta № 1L'operatore + è avido. /(xw)+/
dovrebbe corrispondere all'intera stringa "xaxbxc"
e il gruppo di cattura conterrà il valore finale per abbinare il (xw)
componente. In questo caso "xc"
. Se desideri catturare ogni partita consecutiva, /(xw)+/
dovrebbe invece essere /((?:xw)+)/
. Ciò sposta il gruppo di cattura attorno alla sequenza anziché all'interno di esso. Il (?: )
rappresenta un gruppo non catturante.
MODIFICARE:
Se vuoi ogni istanza di (xw)
, non solo istanze consecutive, non utilizzare l'operatore + o gruppi di acquisizione. Basta utilizzare un'espressione regolare globale: /xw/g
.
"QQxaxbQQxcQQ".match(/xw/g)
i rendimenti ["xa, "xb", "xc"]
.
"QQxaxbQQxcQQ".match(/((?:xw)+)/)
i rendimenti ["xaxb", "xaxb"]
.
MODIFICA 2:
Se desideri cercare solo tra QQ
s, a split
dovrebbe essere il metodo più veloce (Underscore aiuta molto qui.)
_.chain("xyQQxaxbQQxcQQxr".split("QQ"))
.slice(1, -1)
.map(function (string) {
return string.match(/xw/g);
})
.flatten()
.compact()
.value()
yields ["xa", "xb", "xc"]
1 per risposta № 2
Hai solo bisogno di aggiungere g
parametro alla fine della tua regex. g
flag restituisce un array che contiene tutte le corrispondenze, nel nostro caso tutte le corrispondenze di backreference (xw)
In grassetto qui: / QQ (xw) + QQ /g
var matches = str.match(/QQ(xw)+QQ/g)
le partite sono un array
guarda questo: http://jsfiddle.net/SZRSA/3/
0 per risposta № 3
"xaxbxc".match(/xw/g);
che ritorna
["xa", "xb", "xc"]
Come l'OP ha cambiato la domanda. ora è una duplicazione di Espressioni regolari e sub-match JavaScript.
0 per risposta № 4
Forse avvolgere la ripetizione in un gruppo che cattura è ciò che vuoi (catturando tutte le istanze di xw
concatenato insieme):
var matches = str.match(/QQ((xw)+)QQ/)
Questo ritorna "xaxbxc"
come matches[1]
0 per risposta № 5
Se vuoi catturare tutti i gruppi, usa questo:
var matches = str.match(/(xw)/g)
produzione :
["xa", "xb", "xc"]
Ho fatto due modifiche:
- rimosso il
+
come sembri voler che ogni x sia seguita da un carattere - aggiunto il
g
modificatore per chiedere a tutti i gruppi
EDIT: se quello che vuoi è ottenere le tue partite solo quando sono tra QQ e QQ, puoi farlo:
var matches = str.split("QQ").filter(function(v,i){return i%2})
.join(" ").match(/(xw)/g)