0

各開始コメントのIDを取得しようとしている次の正規表現があります。しかし、なぜか最初の一枚しか撮れません。ネストされたコメントの ID は取得されません。コンソールには 1000 しか表示されません。1000 と 2000 の両方を取得しようとしています。正規表現でエラーを見つけられる人はいますか?

<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> 

Mike Samuel の回答に基づいて、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;
               });
        }
    }
4

2 に答える 2

2

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

「1000」領域は「2000」領域とオーバーラップしますが、同じ正規表現と文字列を使用した各呼び出しは最後の一致の最後から開始されるため、execループは重複しない一致のみを検出します。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; }
}
于 2013-03-19T22:31:25.983 に答える
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);
}
于 2013-03-19T23:43:33.817 に答える