2013-04-24 1 views
0

내가 아는 한 여기서 흥미로운 문제를 발견했습니다. 내가 문자열 내에서 교체를 만드는 데 사용하는 정규식 개체가 있습니다. 문제는 특정 문자열을 찾았 기 때문에 추가 대체를 중지하려는 경우 그렇게 할 수 없다는 것입니다. "break"문은 분명히 작동하지 않습니다. 루프가 스위치 케이스가 아니기 때문입니다.javascript regex replacement 함수가 더 많은 대체를하지 못하도록 함

"반품"을 사용하면 교체가 계속됩니다. 함수의 머리 부분에서 "불완전한"변수 (아래 예제 참조)를 사용하여 추가 대체를 방지 할 수 있지만 검사가 진행될 것이므로 필요하지 않은 정규식과 일치하는 횟수만큼 평가됩니다.

이 기능의 대체품을 완전히 중지 할 수있는 방법이 있습니까?

감사합니다.

예 : 대체 정규식이 발견되고이 코드 스토퍼 문자열

전에 발견되는 동안

var regex = new RegExp("whatever", "g"); 
str = str.replace(regex, function(tot, group1) { 
    if (group1 == "i_wanna_stop_str") { 
     incomplete = true; 
     break; <-- not working 
    } else { 
     if (incomplete) { 
      replacement = <captured original>; 
     } 
     else { 
      ... compute replacement ... 
     } 
     return replacement; 
    } 
} 
+1

가 여기에 콜백 함수를 호출 막을 방법은 없지만, 왜 특정 지점까지 매칭을 할 수있는 정규 표현식을 형성 할 수 없습니다? 좋은 서면 정규 표현식이이 문제를 해결할 수없는 예제가 있습니까? – VisioN

+0

확인이 http://stackoverflow.com/questions/3214886/javascript-replace-only-replaces-first-match –

+0

분명히 내가 할 수있는,하지만 여기에 요점이 아니다, 이것은 단지 예입니다. 아마 정확한 질문을해야한다 : "어떻게 특정 경기 후 교체하고이 콜백 기능을 중지 할 수 있습니다?". 여기서 "무엇이든지"라는 문자열은 많은 문자열과 일치 할 수있는 정규 표현식을 의미합니다. – Juanma

답변

1

원래 교체 :

var str = " blah blah whatever blah blah whatever i_wanna_stop_str blah blah whatever"; 
var stopStr = "i_wanna_stop_str"; 
var searchStr = "whatever"; 
while (str.indexOf(searchStr) != -1 && str.indexOf(searchStr) < str.indexOf(stopStr)) { 
    str = str.replace(/whatever/, "some"); 
} 
+0

예, 이것은 작동하지만 중지 단어가 일치하면 콜백을 종료하지 않으므로 불필요한 비교가 여전히 수행됩니다. 어쨌든 고마워. 난 당신이 좋은 해결책을 마련하는 데 성공하면 100 % 정답 http://stackoverflow.com/questions/29403229/cancel-a-callback-in-javascript – Juanma

+0

@Juanma에서처럼 콜백 관리를 처리해야한다고 생각 자신의 질문에 대답함으로써 주저하지 말고 공유하십시오. –

0

루프 교체 : 플래그가 발견되면

var regex = new RegExp("whatever", "g"); 
str = str.replace(regex, function(tot, group1) { 
    if (group1 == "i_wanna_stop_str") { 
     incomplete = true; 
     break; <-- not working 
    } else { 
     ... compute replacement ... 
     return replacement; 
    } 
} 
+0

물론이 방법으로 문제가 해결되지만 내 "콜백 중지 기능"질문에 응답하지 않습니다. 어쨌든 고마워. – Juanma

관련 문제