/ / Come quantificare un gruppo nella regex di Javascript? [duplicato] - javascript, regex, regex-group, quantificatori

Come faccio a quantificare un gruppo nella regex di Javascript? [duplicato] - javascript, regex, regex-group, quantificatori

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 № 1

L'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 QQs, 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

Riferimento


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)