2011-01-20 13 views
6

Tengo un caso en el que trato de reemplazar un determinado patrón por otro. Mi problema es que necesito reemplazar solo la última ocurrencia de ese patrón, no todos. He encontrado esta pregunta:Uso de expresiones regulares para reemplazar solo la última aparición de un patrón con JS

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

Pero no se ajusta a mis necesidades. Como telón de fondo, he de decir que estoy tratando de reemplazar una regla CSS, pero para el ejemplo actual Veamos este texto:

abcd:bka: 

bbb:aad: 

accx:aaa: 

bbb:a0d: 

cczc:aaa: 

Digamos que sólo se desea reemplazar el valor de la acreditación. Mi regla actual será

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

pero solo reemplazará la primera coincidencia, aunque quiero que reemplace la última. Mi patrón actual es en realidad más complejo que este, pero creo que el pseudo problema será suficiente.

Respuesta

8

Trate

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

La afirmación de búsqueda negativa hacia delante se asegura de que no hay más bbb: adelante en el texto. Los paréntesis alrededor de [^:]+ son innecesarios.

Explicación:

(?!  # 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 

La solución [\s\S] JavaScript es necesario porque no tiene una opción para permitir que el punto para que coincida con los saltos de línea.

+0

Me gusta esta respuesta: http://stackoverflow.com/questions/843049/how-to-replace-last-occurence-of-a-word-in-javascript Prefacio con (. *) Para comer tanto como sea posible antes de hacer coincidir. –

+0

@PeterEhrlich: Debería usar '[\ s \ S] *' en su lugar (el punto no coincide con las líneas nuevas), y generalmente prefiero ser explícito al usar expresiones regulares no específicas como '. *', Pero sí, eso funcionaría, también. Si su rendimiento será mejor o peor que el mío depende del texto real en el que se está utilizando. Sospecho que va a ser peor en textos grandes debido a todo el retroceso que causa '. *'. –

Cuestiones relacionadas