在构建交互式表单时,我需要解析用户提交的一些正则表达式,找到每个正则表达式中的每个匹配捕获并获取其索引(捕获组开始的位置)以修改原始字符串(让&#39;例如,在捕获周围添加一些<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+)
。容易得到第一个索引,但第二个索引...... 是否有可能获得与此类似的结构:[{'match': '(\d+)', 'index': 4}, {'match': '(\d+)', 'index': 14}]
?我可以通过一些字符串操作来执行此操作,但我想知道是否有更简单(和{清洁方式。
答案 0 :(得分: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