Убедитесь, что установлен параметр include: ["matches"]
.
Редактировать: Это должно быть include: ["score","matches"]
, а затем в результатах каждого результата объекта будут иметься «соответствия» и «оценка». И матчи будут списком «индексов» для каждого элемента с начальной и конечной позицией для каждого матча.
Кроме того, ответ, который я написал, прежде чем я заметил, что эти варианты были в fuse.js была версия функции partial_ratio из fuzzball.js (мой fuzzywuzzy порт) вместе с difflib изменениями, включающими наиболее подходящий подстроку более длинную строку и ее начальную/конечную позицию вместе со счетом/коэффициентом.
А так как на втором смотрите мой первый ответ не совсем то, что вы искали, и downvoted в любом случае, и я уже написано, вот это тоже :)
var difflib = require('difflib');
var input = "how was the whether in Londom last night?";
var set = ["london uk", "paris"];
console.log(topSubString(input, set));
/*
[score, best matching substring, start, stop]
[ [ 0.5555555555555556, 'Londom la', 23, 32 ],
[ 0.4, 'was t', 4, 9 ] ]
*/
function topSubString(input, set) {
results = [];
for (var s in set) {
results.push(partial_ratio(input, set[s]));
}
results.sort(function (a, b) { return b[0] - a[0] })[0];
return results;
}
function partial_ratio(str1, str2, options) {
if (str1.length <= str2.length) {
var shorter = str1
var longer = str2
}
else {
var shorter = str2
var longer = str1
}
var bestMatch;
var m = new difflib.SequenceMatcher(null, shorter, longer);
var blocks = m.getMatchingBlocks();
var scores = [];
for (var b = 0; b < blocks.length; b++) {
var long_start = (blocks[b][1] - blocks[b][0]) > 0 ? (blocks[b][1] - blocks[b][0]) : 0;
var long_end = long_start + shorter.length;
var long_substr = longer.substring(long_start, long_end);
var ssm = new difflib.SequenceMatcher(null, shorter, long_substr);
var r = ssm.ratio(shorter, long_substr, options);
if (r > 99.5) { bestMatch = [r, long_substr, long_start, long_end]; break; }
else scores.push([r, long_substr, long_start, long_end]);
}
if (!bestMatch) bestMatch = scores.sort(function(a,b){ return b[0] - a[0] })[0];
return bestMatch;
}
https: // WWW .npmjs.com/package/bitap – smcd
Спасибо @smcd. К сожалению, похоже, я не делаю то, что мне нужно. Например, он не возвращает индексы, между которыми найденная строка находилась во входном тексте. – PJC