【发布时间】:2014-11-11 04:23:19
【问题描述】:
我想比较两个字符串(之前和之后)并准确检测它们之间的变化和变化。
如有任何更改,我想知道:
- 变化的起始位置(含,从0开始)
- 相对于前一个文本的更改的结束位置(包括,从 0 开始)
- “变化”
假设字符串一次只在一个地方发生变化(例如,永远不会“Bill” -> “K iln”)。
另外,我需要开始和结束位置来反映变化的类型:
- 如果删除,开始和结束位置应该分别是被删除文本的开始和结束位置
- 如果替换,开始和结束位置应该分别是“删除”文本的开始和结束位置(更改将是“添加”文本)
- 如果插入,开始和结束位置应该相同;文本的入口点
- 如果没有变化,让开始和结束位置保持为零,变化为空
例如:
"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));
如何判断是否发生了插入、删除或替换?
【问题讨论】:
-
我建议使用库而不是自己重新创建轮子。有很多差异库,例如:code.google.com/p/google-diff-match-patch
-
将两个字符串分成两半并查看每一半是否匹配可能会更快。如果一样的话,很酷。如果不是,则取第一个不匹配并不断重复,直到找到第一个更改的位置。
标签: javascript string difference