将字符串差异计算为范围

Calculate string difference as range

本文关键字:范围 计算 字符串      更新时间:2023-09-26

我试图找出用户在字符串中更改了哪些字符。幸运的是,我可以假设只有一个随之而来的更改块。

我什至找不到更改区域开始的位置:

var originalVal, val; //strings
//The ranges
var original = [0,0];
var new_rang = [0,0];
//Old length, new length
var ol = originalVal.length;
var nl = val.length;
//Find where the change begins (that should be the same for both arrays)
for(var i=0; ; i++) {
  //If end of string was reached or the strings are different
  if((i>=ol||i>=nl) || originalVal[i]!=val[i]) {
    original[0] = new_rang[0] = i;
    //Set these to i too, assuming there was no change
    original[1] = new_rang[1] = i;
    break;
  }
}  

如果有一行相同的字符并且用户删除中间的一个字符,这将完全中断:

唰�
� 米

毫米X

脚本会说更改发生在 4 点,x移动的地方。但事实上,似乎甚至无法说出哪个m被删除了。

但是,我可以分辨出光标位置在开始时的位置和结尾的位置。这样看起来更有希望,但我仍然不知道该怎么办:

毫米

|毫米X

|米
m|mmx

这次我可以看到哪个m被删除了。但我仍然不知道如何向计算机解释它。

这是我认为您可能正在寻找的内容。请澄清您的问题。

var Console = function() {
  this.log = function(msg) {
    debug(msg)
  };
};
var console = new Console();
function diffLengths(longer, shorter) {
  var indexes = [];
  var isTheSame = true;
  for (var i = 0; i < shorter.length; i++) {
    if (shorter[i] != longer[i]) {
      isTheSame = false;
      indexes.push(i);
    }
  };
  if (isTheSame) {
    // The shorter string is exactly the same as the longer string
    // except for the extra characters in the longer string
    indexes.push(shorter.length);
  }
  return indexes;
}
function getDiffRange(first_string, second_string) {
  var indexes = [];
  if (first_string.length > second_string.length) {
    return diffLengths(first_string, second_string);
  } else if (first_string.length < second_string.length) {
    return diffLengths(second_string, first_string);
  } else {
    for (var i = 0; i < first_string.length; i++) {
      if (second_string[i] != first_string[i]) {
        indexes.push(i);
      }
    };
  }
  return indexes;
}
var range = getDiffRange('mmmmx', 'mmmx');
document.getElementById('result-1').innerHTML = range[0] + " - " + range[range.length - 1];
var range = getDiffRange('mmmmx', 'mmmxc');
document.getElementById('result-2').innerHTML = range[0] + " - " + range[range.length - 1];
var range = getDiffRange('mm', 'mmx');
document.getElementById('result-3').innerHTML = range[0] + " - " + range[range.length - 1];
table, th, td {
	border-collapse: collapse;
	border: 1px solid #ddd;
	text-align: left;
	padding: 7px;
}
<html>
<body>
  <table>
    <tr>
      <th>input</th>
      <th>result</th>
    </tr>
    <tr>
      <td>'mmmmx', 'mmmx':</td>
      <td id='result-1'></td>
    </tr>
    <tr>
      <td>'mmmmx','mmmxc':</td>
      <td id='result-2'></td>
    </tr>
    <tr>
      <td>'mm','mmx':</td>
      <td id='result-3'></td>
    </tr>
  </table>
</body>
</html>