2011-01-09 16 views
5

Questo è un esempio della stringa che viene lavorato con:Regex (espressioni regolari), sostituire il secondo avvenimento in javascript

xxxxxx[xxxxxx][7][xxxxxx][9][xxxxxx] 

Sto avendo un po 'di problemi di corrispondenza la seconda occorrenza di una partita, ho vuoi restituire le 2 parentesi quadre con un numero interno. Ho qualche regex trovare i primi backets quadrati con i numeri in una stringa:

\[+[0-9]+\] 

Ciò restituisce [7], ma voglio tornare [9].

sto usando la funzione di sostituire il Javascript, il seguente espressione regolare corrisponde la seconda occorrenza (il [9]) in applicazioni testeing regex, tuttavia non viene sostituito correttamente nel Javascript funzione di sostituzione:

(?:.*?(\[+[0-9]+\])){2} 

La mia domanda è come usare la regex precedente per sostituire [9] in Javasctipt o c'è un'altra regex che corrisponde alla seconda occorrenza di un numero tra parentesi quadre.

Cheers!

risposta

3

Se xxx è proprio qualsiasi stringa, e non necessariamente un numero, allora questo potrebbe essere ciò che si desidera:

(\[[0-9]+\]\[.*?\])\[([0-9]+)\] 

Questo sembra per il secondo numero in []. Sostituirlo con $1[<replacement>]. Play with it on rubular.

tua espressione regolare non riesce a funzionare come previsto perché i gruppi seguiti da + finire solo tenendo la ultima[xxx].

+0

Perché stai usando '{3}' come quantificatore? Questo non sembra essere "ci saranno sempre tre tag prima di quello che vogliamo, e uno dopo", non dovresti basare la regex sui requisiti effettivi dichiarati dal richiedente? Personalmente, vorrei usare '/ (\ [\ d + \] (?: \ [. *? \ D. *? \]) *) (\ [\ D + \])/\ 1 [sostituzione] /' –

+0

@ Anon Non sappiamo che 'xxx' non è un numero. Ho pensato che lo fosse, ma forse mi sbaglio. – marcog

+0

Ho aggiunto un altro regex che sostituirà il secondo '[]'. – marcog

1

Prova

result = subject.replace(/(\[\d\]\[[^\]]+\])\[\d\]/, "$1[replace]"); 

Come regex commentato:

(  # capture the following in backref 1: 
\[\d\] # first occurrence of [digit] 
\[  # [ 
[^\]]+ # any sequence of characters except ] 
\]  # ] 
)  # end of capturing group 
\[\d\] # match the second occurence of [digit] 

Se il numero di [xxx] gruppi tra la prima e la seconda [digit] gruppo è variabile, quindi utilizzare

result = subject.replace(/(\[\d\](?:\[[^\]]+\])*?)\[\d\]/, "$1[replace]"); 

By che circonda la parte corrispondente allo [xxx] gruppi con parentesi (non acquisite) e il quantificatore pigro *? Sto chiedendo al motore regex di far corrispondere il minor numero possibile di tali gruppi, ma il numero necessario è il gruppo [digit].

0
console.log("xxxxxx[xxxxxx][7][xxxxxx][9][xxxxxx]".replace(
/^(.*\[[0-9]+\].*)(\[[0-9]+\])(.*)$/, 
'$1[15]$3')); // replace with matches before ($1) and after ($3) your match ($2) 

rendimenti:

// xxxxxx[xxxxxx][7][xxxxxx][15][xxxxxx] 

E corrisponderanno dove [n] è preceduta da 1 set di staffe con numeri all'interno.

+0

Non sono sicuro se questo è importante, ma questo non funziona [1] [2] [3] - sostituisce l'ultimo [3]. Forse l'OP dovrebbe fornire alcuni test ... – Hemlock

Problemi correlati