2011-01-20 3 views
6

あるパターンを別のパターンに置き換えようとしている場合があります。私の問題は、それらのすべてではなく、そのパターンの最後のオカレンスだけを置き換える必要があるということです。私はこの質問見つけた:regexを使ってパターンの最後のものだけをJSと置換する

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

をしかし、それは私のニーズに適合しません。背景として、私はCSSルールを交換しようとしていますと言うだろうが、現在の例については、このテキストを見てみましょう:

abcd:bka: 

bbb:aad: 

accx:aaa: 

bbb:a0d: 

cczc:aaa: 

は私だけBBBの値を交換したいと言うことができます。私の現在のルールは

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

となりますが、最後のものを置き換えたいだけです。 私の現在のパターンは実際これよりも複雑ですが、擬似問題で十分です。

答えて

8

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

否定先読みアサーションが先のテキストには、さらにbbb:がないことを確認します試してみてください。 [^:]+周括弧は不要です。

説明:JavaScriptはドットが改行にマッチすることを可能にするオプションを持っていないため

(?!  # 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]回避策が必要です。

+0

私はこの回答が好きです:http://stackoverflow.com/questions/843049/how-to-replace-last-occurence-of-a-word-in-javascript可能な限り一致させる前に。 –

+0

@PeterEhrlich:代わりに '[\ s \ S] *'を使う必要があります(ドットは改行にマッチしません)。私は一般的に '。*'のような非特定の正規表現を使うのが好きです。うまくいくでしょう。そのパフォーマンスが私のものよりも良いか悪いかは、実際に使用されているテキストによって決まります。私は大文字では '。*'が引き起こすすべてのバックトラックのために悪化するだろうと思うだろう。 –

関連する問題