Имеется строка, для примера "aa".
Имеется много регулярок, генерируемых скриптом, для примера две регулярки:
1) /a/
2) /a+/
Их порядок жестко задан и не может быть изменен. Сами они также не могут быть изменены, поскольку все должно быть автоматизировано.
Необходимо найти наиболее подходящую для строки регулярку, тоесть захватывающую как можно большую часть строки.
Сейчас это делается в цикле, перебором всех регулярок:
var patterns = ['a', 'a+'];
var string = 'aa';
var regexps = patterns.map(function(item){
return new RegExp(item);
});
var temp = '', index = -1, match, matches;
for (var i = 0; i < regexps.length; i++) {
matches = string.match(regexps[i]);
if (matches && (match = matches[0]).length > temp.length) {
temp = match;
index = i;
}
}
alert(index + ':' + temp);
Это очень медленно. Впринципе, если бы требовалось найти первую подходящую регулярку, а не самую "точную", то можно было бы совместить все регулярки в одну.
Вопрос можно ли как-то совместить эти регулярки в одну, но чтобы срабатывала именно самая точная из них?
Вот моя попытка.
var patterns = ['a', 'a+'];
var string = 'aa';
var pattern = patterns.map(function(item, index){
return ['(', ')'].join(item);
}).join('|');
var regexp = new RegExp(pattern, 'g');
var temp = '', index = -1, match, matches;
var matches = string.match(regexp);
if (matches) {
for (var i = 1; i < matches.length; i++) {
if ((match = matches[i]).length > temp.length) {
temp = match;
index = i - 1;
}
}
}
alert(index + ':' + temp);
alert(matches);