Я хотел бы сравнить две строки (до и после) и точно определить, где и что изменилось между ними.
При любых изменениях я хочу знать:
- Начальная позиция изменения (включительно, начиная с 0)
- Конечная позиция изменения (включительно, начиная с 0) относительно предыдущего текста
- Перемена"
Предположим, что строки будут изменяться только в одном месте за раз (например, никогда не "Bill" -> "Kilн").
Кроме того, мне нужно, чтобы начальная и конечная позиции отражали тип изменения:
- При удалении начальная и конечная позиция должны быть начальной и конечной позициями удаленного текста соответственно.
- При замене начальная и конечная позиция должны быть начальной и конечной позициями «удаленного» текста соответственно (изменение будет «добавленным» текстом)
- При вставке начальная и конечная позиции должны совпадать; точка входа в текст
- Если нет изменений, пусть начальная и конечная позиции остаются нулевыми, с пустым изменением
Например:
"0123456789" -> "03456789"
Start: 1, End: 2, Change: "" (deletion)
"03456789" -> "0123456789"
Start: 1, End: 1, Change: "12" (insertion)
"Hello World!" -> "Hello Aliens!"
Start: 6, End: 10, Change: "Aliens" (replacement)
"Hi" -> "Hi"
Start: 0, End: 0, Change: "" (no change)
Мне удалось несколько определить позиции измененного текста, но это работает не во всех случаях, потому что для того, чтобы сделать это точно, мне нужно знать, какое изменение было сделано.
var OldText = "My edited string!";
var NewText = "My first string!";
var ChangeStart = 0;
var NewChangeEnd = 0;
var OldChangeEnd = 0;
console.log("Comparing start:");
for (var i = 0; i < NewText.length; i++) {
console.log(i + ": " + NewText[i] + " -> " + OldText[i]);
if (NewText[i] != OldText[i]) {
ChangeStart = i;
break;
}
}
console.log("Comparing end:");
// "Addition"?
if (NewText.length > OldText.length) {
for (var i = 1; i < NewText.length; i++) {
console.log(i + "(N: " + (NewText.length - i) + " O: " + (OldText.length - i) + ": " + NewText.substring(NewText.length - i, NewText.length - i + 1) + " -> " + OldText.substring(OldText.length - i, OldText.length - i + 1));
if (NewText.substring(NewText.length - i, NewText.length - i + 1) != OldText.substring(OldText.length - i, OldText.length - i + 1)) {
NewChangeEnd = NewText.length - i;
OldChangeEnd = OldText.length - i;
break;
}
}
// "Deletion"?
} else if (NewText.length < OldText.length) {
for (var i = 1; i < OldText.length; i++) {
console.log(i + "(N: " + (NewText.length - i) + " O: " + (OldText.length - i) + ": " + NewText.substring(NewText.length - i, NewText.length - i + 1) + " -> " + OldText.substring(OldText.length - i, OldText.length - i + 1));
if (NewText.substring(NewText.length - i, NewText.length - i + 1) != OldText.substring(OldText.length - i, OldText.length - i + 1)) {
NewChangeEnd = NewText.length - i;
OldChangeEnd = OldText.length - i;
break;
}
}
// Same length...
} else {
// Do something
}
console.log("Change start: " + ChangeStart);
console.log("NChange end : " + NewChangeEnd);
console.log("OChange end : " + OldChangeEnd);
console.log("Change: " + OldText.substring(ChangeStart, OldChangeEnd + 1));
Как узнать, была ли вставка, удаление или замена?
Я искал и нашел несколько другие похожие вопросы, но они, похоже, не помогают.