2011-01-20 11 views
6

Ho un caso in cui sto cercando di sostituire un determinato modello con un altro. Il mio problema è che ho bisogno di sostituire solo l'ultima occorrenza di quel modello, non tutti. Ho trovato questa domanda:Utilizzo di espressioni regolari per sostituire solo l'ultima occorrenza di un motivo con JS

How to replace last occurrence of characters in a string using javascript

Ma non si adatta alle mie esigenze. Come sfondo, devo dire che sto cercando di sostituire una regola CSS, ma per l'esempio attuale consente di guardare a questo testo:

abcd:bka: 

bbb:aad: 

accx:aaa: 

bbb:a0d: 

cczc:aaa: 

Diciamo che ho solo voglia di sostituire il valore di BBB. La mia regola attuale sarà

text.replace(/(\s*bbb:)([^:]+)/,"$1aaa") 

ma sostituirà solo la prima partita, mentre voglio che sostituisca l'ultima. Il mio schema attuale è in realtà più complesso di questo, ma penso che lo pseudo problema sarà sufficiente.

risposta

8

Prova

text.replace(/(\s*bbb:)(?![\s\S]*bbb:)[^:]+/,"$1aaa") 

Il lookahead negativo fa in modo che non vi siano ulteriori bbb: avanti nel testo. Le parentesi intorno a [^:]+ non sono necessarie.

Spiegazione:

(?!  # Assert that it is impossible to match the following after the current position: 
[\s\S]* # any number of characters including newlines 
bbb:  # the literal text bbb: 
)   # End of lookahead assertion 

Il [\s\S] soluzione è necessaria perché JavaScript non ha un opzione per consentire il punto da abbinare a capo.

+0

Mi piace questa risposta: http://stackoverflow.com/questions/843049/how-to-replace-last-occurence-of-a-word-in-javascript Prefazione con (. *) Per mangiare tanto il più possibile prima della corrispondenza. –

+0

@PeterEhrlich: dovresti usare '[\ s \ S] *' invece (il punto non corrisponde a newline), e generalmente preferisco essere esplicito nell'usare espressioni regolari non specifiche come '. *', Ma sì, che funzionerebbe anche Se le sue prestazioni saranno migliori o peggiori delle mie dipenderà dal testo reale su cui questo viene usato. Sospetto che sarà peggio nei testi di grandi dimensioni a causa di tutto il backtracking che provoca '. *' –

Problemi correlati