2013-03-19 80 views
0

我有以下正则表达式,我试图捕获每个开始评论的ID。但由于某种原因,我只能捕获第一个。它不会获取嵌套注释的Id。它只打印1000到控制台。我试图让它捕获1000和2000.任何人都可以在我的正则表达式中发现错误?正则表达式从文本中捕获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因为每次调用exec具有相同的正则表达式和字符串,从最后一场比赛结束时开始。为了解决这个问题,尝试

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我不相信它,直到我尝试了我自己,但它的作品。 – 2013-03-19 22:42:10

+0

@ p.s.w.g,是的。替代品功能的副作用有点令人讨厌,但只有几种方法可以获得重叠匹配 - 反复匹配并移除旧匹配;尝试将所有后缀与锚定在'^'处的正则表达式匹配;或者用一个结束锚('$')正则表达式来尝试所有的前缀。 – 2013-03-19 22:46:41

+0

嗯..它似乎打印1000两次而不是1000和2000.它虽然接近!我认为在结尾 – TGH 2013-03-19 22:52:33

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); 
}