JS

2011-01-20 20 views
6

ile bir modelin yalnızca son oluşumunu değiştirmek için normal ifadeyi kullanma Belirli bir deseni başka biriyle değiştirmeye çalıştığım bir durum var. Benim sorunum, sadece o desenin son oluşumunu değiştirmem gerektiğiydi, hepsi değil. Ben bu soruyu buldum:JS

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

Ama benim ihtiyaçlarına uygun değildir. bir arka plan olarak, sana bir CSS kuralını değiştirmeye çalışıyorum diyecekler, ancak mevcut örneğin bu metinde bakalım:

abcd:bka: 

bbb:aad: 

accx:aaa: 

bbb:a0d: 

cczc:aaa: 

Sadece bbb değerini değiştirmek istiyor diyelim. Benim şu anki kural

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

olacak ama sonuncuyu değiştirmek isterken sadece ilk maçı değiştirecektir. Şu anki modelim aslında bundan daha karmaşık, ancak sözde sorunun yeterli olacağını düşünüyorum.

cevap

8

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

negatif ileri yönlü sav önde metinde başka bbb: olmadığından emin kılar deneyin. [^:]+ çevresindeki parantezler gereksizdir.

Açıklama: JavaScript nokta yeni satır maç için izin için bir seçenek olmadığı için

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

[\s\S] geçici çözüm gereklidir.

+0

Bu cevabı beğeniyorum: http://stackoverflow.com/questions/843049/how-to-replace-last-occurence-of-a-word-in-javascript Örtmek için (. *) Ile önsöz eşleşmeden önce mümkün olduğunca. –

+0

@PeterEhrlich: '[\ s \ S] * 'yerine kullanmanız gerekir (nokta yeni satırlarla uyuşmuyor) ve genellikle'. * 'Gibi belirsiz ifadeleri kullanmaya açık olmayı tercih ederim. de çalışırdı. Performansının benimkinden daha iyi veya daha kötü olup olmayacağı, üzerinde kullanıldığı gerçek metne bağlı. Büyük metinlerde daha da kötüye gideceğinden şüpheleniyorum çünkü tüm bu geri dönüşler '' '. –