2013-03-19 2 views
0

각 시작 주석의 ID를 캡처하려고하는 다음 정규 표현식을 사용합니다. 그러나 웬일인지 나는 첫번째 사람을 붙잡을 수있다. 중첩 된 주석의 ID를 잡지 않습니다. 콘솔에 1000 인쇄합니다. 나는 그것을 모두 1000과 2000을 캡처 얻으려고. 누구든지 내 정규식에서 오류를 찾을 수 있습니까? 마이크 사무엘의 답변에 따라 Regex에서 텍스트에서 ID를 캡처하려면

<script type="text/javascript"> 

    function ExtractText() { 
     var regex = /\<!--Start([0-9]{4})-->([\s\S]*?)<!--End[0-9]{4}-->/gm; 
     var match; 
     while (match = regex.exec($("#myHtml").html())) { 
      console.log(match[1]); 
     } 
    } 

</script> 

<div id="myHtml"> 
    <!--Start1000-->Text on<!--Start2000-->the left<!--End1000-->Text on the right<!--End2000--> 
</div> 

나는 다음에 내 JS 업데이트 :

function GetAllIds() { 

     var regex = /<!--Start([0-9]{4})-->([\s\S]*?)<!--End\1-->/g; 
     var text = $("#myHtml").html(); 
     var match; 
     while (regex.test(text)) { 
      text = text.replace(
       regex, 
       function (_, id, content) { 
        console.log(id); 
        return content; 
       }); 
     } 
    } 

답변

2

<!--Start1000-->Text on<!--Start2000-->the left<!--End1000-->Text on the right<!--End2000--> 

은 "1000"영역은 "2000"지역을 겹쳐

에서 그러나 exec 루프는 겹치지 않고 을 찾는다. matc에 대한 각 호출 이후 마지막 정규식의 끝에서 동일한 정규식과 문자열이 시작되기 때문입니다. 이 문제를 해결하기 위해, 당신은 그룹화 사용할 수 있습니다

var regex = /<!--Start([0-9]{4})-->([\s\S]*?)<!--End\1-->/g; 
for (var s = $("#myHtml").html(), sWithoutComment; 
    // Keep going until we fail to replace a comment bracketed chunk 
    // with the chunk minus comments. 
    true; 
    s = sWithoutComment) { 
    // Replace one group of non-overlapping comment pairs. 
    sWithoutComment = s.replace(
    regex, 
    function (_, id, content) { 
     console.log(id); 
     // Replace the whole thing with the body. 
     return content; 
    }); 
    if (s === sWithoutComment) { break; } 
} 
+0

+1 나는 그것을 믿지 않았다, 그러나 그것은 작동합니다. –

+0

@ p.s.w.g, 예. replacer 함수의 부작용은 다소 불쾌하지만 모든 겹치기 일치를 얻기위한 몇 가지 방법이 있습니다. 이전 반복을 반복적으로 일치시키고 제거합니다. 모든 접미사를'^'에 고정 된 정규식으로 일치 시키십시오. 또는 모든 접두사에 end-anchored ('$') 정규 표현식을 사용하십시오. –

+0

흠 .. 1000과 2000 대신 두 번 1000 인쇄하는 것 같습니다. 그것은 가까이있어! 나는 끝에 여분의 괄호가 두 개 있다고 생각한다 – TGH

1

을 시도하고 다른 정규 표현식 : 나 자신을 위해 그것을 시도 할 때까지

var regex = /(<!--Start)([0-9]{4})/ig; 
var str = document.getElementById('myHtml').innerHTML; 
var matches = str.match(regex); 
for(var i=0;i<matches.length;i++){ 
    var m = matches[i]; 
    var num = m.match(/(\d+)/)[1]; 
    console.log(num); 
} 
관련 문제