2011-01-20 6 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:이 없음을 확인합니다보십시오. [^:]+ 주변의 괄호는 필요하지 않습니다.

설명 : 자바 스크립트는 점은 줄 바꿈을 일치시킬 수있는 옵션이 없기 때문에

(?!  # 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] *'를 써야한다. (도트는 개행과 일치하지 않는다.) 나는 일반적으로'. *'와 같은 불특정 한 정규 표현식을 사용하는 것을 선호하지만, 그렇다. 일하게 될거야. 성능이 내 것보다 좋든 나쁘 든간에 실제로 사용되는 텍스트에 따라 다릅니다. '. *'원인으로 인해 큰 텍스트 때문에 악화 될 것으로 생각됩니다. –

관련 문제