2

対話型フォームの構築では、ユーザーが送信した正規表現を解析し、各正規表現ですべての一致キャプチャを見つけて、それらのインデックス (キャプチャ グループが始まる場所) を取得して、元の文字列を変更する必要があります (いくつかの<strong>タグを追加するとしましょう)。たとえば、キャプチャ)。最後に、たとえばに変更できる
ようにしたいと考えています。ip:(.+);port:(\d+)ip:<strong>(.+)</strong>;port:<strong>(\d+)</strong>

現在、私はこの小さなコードを持っています:

// Called somewhere after user entered every regex he wants
$('input.regex').each(function () {
    pattern = $(this).val(); // for non jQuery guys: just returns the content of the input
    captures = pattern.match(/(\([^\(\)]+\))/g);
    for(idx in captures) {
        console.log(captures[idx]);
    }
});

これにより、見つかったすべてのキャプチャ グループが返されます (ユーザーがサブグループを入力できないことを認めてください...ええ、正規表現はすでに少し頭痛の種になる可能性があります :-)) いくつかの例で実行すると、今のところ必要なものが得られます。

  • オンip:(.+);port:(\d+)、出力(.+)および(\d+)
  • オンip:(?P<sourceip>[\d\.]);port:(\d{2,5})、出力(?P<sourceip>[\d\.])および(\d{2,5})

今私が欲しかったのは、各キャプチャの開始のインデックスを取得することです。indexOf があることは知っていますが、同じキャプチャを複数回行うことができます。例えば:

  • id1:(\d+);id2:(\d+)現在、 と を出力(\d+)してい(\d+)ます。最初のインデックスは簡単に取得できますが、2 番目のインデックスは...

これに似た構造を得る可能性はあります[{'match': '(\d+)', 'index': 4}, {'match': '(\d+)', 'index': 14}]か? いくつかの文字列操作でこれを行うことができますが、より簡単な (そしてよりクリーンな) 方法があるかどうかを知りたいです。

4

1 に答える 1

2

これには RexExp.exec() を使用します。RexExp で動作し、文字列と照合しますが、最も重要なことは、このように反復できる各一致の配列を返すことです。

var match; //Match object.
var matches = []; //Matches return, Array filled with match records.

var regex = "..."; //Current Regex.
var string = "..."; //Current String.

while((match = regex.exec(string)) !== null){
    var matchRecord = {};
    matchRecord.match = regex;
    matchRecord.index = match.index; //Might want to increment by 1 to make Human Readable?
    matches.push(matchRecord);
}

注: regexp.exec の詳細については、https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec をご覧ください。

于 2013-08-08T10:51:38.617 に答える