Javascript 将每个事件与正则表达式匹配,并以字符串形式获取它们的索引

Javascript 将每个事件与正则表达式匹配,并以字符串形式获取它们的索引,javascript,regex,Javascript,Regex,在交互式表单的构建过程中,我需要解析用户提交的一些正则表达式,在每个正则表达式中查找每个匹配捕获,并获取它们的索引(捕获组开始的地方)以修改原始字符串(例如,在捕获周围添加一些标记) 最后,我希望能够修改ip:(.+);端口:(\d+)进入ip:(.+);端口:(\d+)例如 目前我有一段代码: // Called somewhere after user entered every regex he wants $('input.regex').each(function () { p

在交互式表单的构建过程中,我需要解析用户提交的一些正则表达式,在每个正则表达式中查找每个匹配捕获,并获取它们的索引(捕获组开始的地方)以修改原始字符串(例如,在捕获周围添加一些
标记)
最后,我希望能够修改
ip:(.+);端口:(\d+)
进入
ip:(.+);端口:(\d+)
例如

目前我有一段代码:

// 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:(.+);端口:(\d+)
    ,输出
    (.+)
    (\d+)
  • ip:(?P[\d\.]);端口:(\d{2,5})
    ,输出
    (?P[\d\.])
    (\d{2,5})
现在我想得到的是每个捕获开始的索引。我知道有indexOf,但我可以多次捕获相同的内容。例如:

  • id1:(\d+);id2:(\d+)
    当前输出
    (\d+)
    (\d+)
    。很容易得到第一个索引,但第二个索引
是否有可能获得类似的结构:
[{'match':'(\d+),'index':4},{'match':'(\d+),'index':14}]
我可以通过一些字符串操作来实现这一点,但我想知道是否有更简单(更干净)的方法

对此,我将使用rexep.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的更多信息,请参见:

我还想保留捕获列表,而不仅仅是在其周围添加一些标记。我不认为
string.replace
适用于此:/@maximelrant看看这就是我目前使用的。。。我试图访问
索引
属性,但每次它都给了我
未定义的
。通过使用调试器查看,我得到了一个数组,其中包含匹配项和属性长度。非常不错,谢谢。当我试图使用
exec()
时,我总是得到一个无限循环,因为我忽略了
==测试,我猜。谢谢