2013-01-30 4 views
1

나는 정규식을 알아 내려고하고있다. 나는 그것에 대해 상당히 새롭고 몇 줄의 코드로 다음을 할 수 있는지 궁금해하고 있습니다. 여기서 switch 문을 사용하지 않으려 고합니다. 따라서 다음과 같은 아이디어를 생각해 냈습니다.정규 표현식 검색 결과에 따라 단어 바꾸기

먼저이 작업을 수행하는 방법을 설명합니다. 문자열을 가져 와서 키를 변수가 이미 로컬에있는 것으로 바꿉니다. 메서드에서. 이런 식으로 뭔가 : 그것이 가능하다면 item a and item b have been replaced!

확실하지,하지만 그 일을하는 방법을 알고 싶어요 :

var a = 'item a', 
    b = 'item b', 
    string = '@[email protected] and @[email protected] have been replaced!', 
    regex = /\@[a|b]\@/g; 

//now somehow replace this conditionally 

return string.replace(regex, this[replacerResut]); 

그리고 출력이 될 것입니다. 두 개 이상의 지역 변수가 있기 때문에 왜 스위치를 사용하고 싶지 않은지 알 수 있습니다. 그리고 내 신인은 내가하는 일이라고 말합니다! 그래서 나는 그것이 틀렸다는 것을 알고 있습니다. 다형성 코드를 작성하려고합니다. 도와 줘서 고마워!

+0

만약' a','b' 등은 배열보다 변수 여야 만합니다. 왜냐하면 JS에 변수 변수가 없기 때문입니다. 배열/객체 값이 될 수 있다면 가능합니다. –

답변

4

자바 스크립트 String#replace가 콜백을 지원하기 때문에 그것은 가능합니다,하지만 당신은 ("a"을 알고 var a의 값이 깨끗한 방법으로 할 수 없습니다지고) 하나의 객체로 대체를 수집해야합니다

var replacement={ 
     a : 'item a', 
     b : 'item b' 
    }, 
    string = '@[email protected] and @[email protected] have been replaced!', 
    regex = /\@([ab])\@/g; //note the added capturing group 


return string.replace(regex, function(whole, key){ 
    return replacement[key]; 
}); 

을 선택적으로 :

var a = 'item a', 
    b = 'item b', 
    string = '@[email protected] and @[email protected] have been replaced!', 
    regex = /\@[ab]\@/g; 


var replacement = {"@[email protected]":a, "@[email protected]":b}; 
return string.replace(regex, function(whole){ 
    return replacement[whole]; 
}); 

보조 노트 :

정규 표현식 @[a|b]@@[email protected]@[email protected]과 일치하지만 @|@이됩니다. 어느 교대 (@(a|b)@, 또는 문자 그룹 (@[ab]@)를 사용하여 둘을 혼동하지 마십시오

그들이 내가 악)를 호출 할 것이지만 window (사용 지역 변수가 아닌 경우 수행 할 수 있습니다
+0

얀 너 너 남자 야! 도와 주셔서 대단히 감사합니다. 나는 당신의 첫 번째 제안과 함께 끝났다!그냥 대체 전체 부분을 바꾸는 부분에서 사소한 변화를했습니다. return 대체 [whole.replace (/ @/g, '']];''@ '를 제거하기 위해 계속 정의되지 않은 변수를 얻었습니다. 'replacement [@ a @]'너 없이는 할 수 없었어! 다시 한 번 감사드립니다! –

+1

첫번째 버전은'replacement [ "a"]'를 찾지 않습니다. 방금 확인 했어. 두 번째 버전은 그렇지만 그 부분을 설명했습니다. –

1

:..

string.replace(regex, function (match, group) { 
    return window[group]; 
}); 
가 당신이 할 수있는 경우 문자열 값으로 교체 열쇠로 일치하고 함께

객체에 넣어

을 내가 추천이 정규식 :.

regex = /@(\w+?)@/g; 

http://jsfiddle.net/p4uvW/

+0

로컬 변수를 사용해도 할 수 있지만 여전히 악합니다 ('window [group]'보다 악합니다) –

+0

Ahem. 먼저'window [group]'을 사용하라고 제안하면'/ @ (\ w +?) @ /'를 제안합니다. 모든 전역 변수를 문자열로 대체 할 수 있는지 확인 하시겠습니까? –

+0

또한 브라우저 환경 밖에서는 작동하지 않습니다. 좀 더 일반적인 것을 원한다면, 글로벌'this'를 포착 할 수 있습니다 :'var global = this' –

2

1 월 Dvorak의 대답은 앞으로의 길입니다. 그냥 부록으로, 그에서 제공하는 코드가 만들어 질 수도 "청소기", 그것이 replace 호출이 돌아 오면 GC'ed 할 수 있도록 교체, 폐쇄 개체를 개체를 사용하여 :

string.replace(expression, (function() 
{ 
    var replacement = {a: 'item a', 
         b: 'item b'}; 
    return function(match) 
    {//the actual callback 
     return replacement[match]; 
    }; 
}()));//IIFE 
//console.log(replacement);//undefined, can't be referenced anymore and may be flagged for GC 

당신 JS에서 실제 메모리 관리를 수행 할 수는 없지만 클로저 및 스코프를 사용하여 플래그 & 스윕 가비지 컬렉터에 영향을 줄 수 있습니다 ...

+0

초기 범위가 충분히 좁아서 네임 스페이스 혼란이 일어나지 않을 것으로 예상했습니다. 또한, 대체 객체가 작 으면 메모리 사용에 대해 걱정하지 않아도됩니다. 대체 오브젝트가 거대 할 수 있고 대체 오브젝트를 한 번만 수행하면 (오브젝트를 여러 번 다시 생성하지 않아도 됨) 좋은 참고 사항입니다. –

+0

@JanDvorak : 나는 당신과 동의한다. 나는이 클로저 접근법을 여기에서 멀리 떨어진 "더 나은"대안으로 제시하려고하지 않았다. 당신이 투표 한 사람이 당신 것입니다. 말하듯이 대체 객체가 거대한 경우이 접근 방식은 메모리 관리를 제어 할 수있는 형태를 제공합니다. –

+0

종결되지 않는 것에 대한 내 의견을 훑어보십시오. 나는 replacemenent 객체의 범위가 IIFE라는 것을 알지 못했다. 어떻게 든 나는 IIFE가 무엇이든 돌려 보내는 것을 싫어한다. –