如何比较两个字符串并得到不同的部分

How to compare two Strings and get Different part

本文关键字:串并 字符 比较 何比较 两个 字符串      更新时间:2023-09-26

现在我有两个字符串,

var str1 = "A10B1C101D11";
var str2 = "A1B22C101D110E1";

我要做的是区分它们之间的区别,结果看起来像

A10B1C101D11

A10 B22 C101 D110E1

它遵循相同的模式,一个字符和一个数字。如果这个角色不存在,或者他们之间的数字不同,我会说他们是不同的,并突出不同的部分。正则表达式或其他好的解决方案可以做到这一点吗?提前感谢!

让我首先说明regexp可能不是最好的工具。由于字符串具有您所知道的简单格式,因此将字符串解析为令牌,然后比较令牌将更快更安全。

然而,你可以在Regexp中做到这一点,尽管在javascript中你受到缺乏向后看的阻碍。

这样做的方法是使用负向前看来防止包含在其他字符串中的匹配。但是,由于javascript不支持向后看,您可能需要从两个方向进行搜索。

我们通过连接字符串来实现这一点,并使用可用于测试的分隔符。

如果使用'|'作为分隔符,则regexp变为;

/('D'd*)(?=(?:'||'D.*'|))(?!.*'|(.*'d)?'1('D|$))/g

查找第二个字符串中第一个字符串中不存在的标记,执行;

var bothstring=str2.concat("|",str1);
var re=/('D'd*)(?=(?:'||'D.*'|))(?!.*'|(.*'d)?'1('D|$))/g;
var match=re.exec(bothstring);

对re.exec的后续调用将返回后面的匹配项。因此,您可以像下面的示例那样遍历它们;

while (match!=null){
    alert("'""+match+"'" At position "+match.index);
    match=re.exec(t);
}

如前所述,它在str2中给出与str1不同的令牌。要获得str1中不同的标记,请使用相同的代码,但在连接字符串时更改str1和str2的顺序。

如果处理潜在的脏输入,上面的代码可能不安全。特别是,如果输入一个像"A100|A100"这样的字符串,它可能会行为不当,第一个A100不会被认为有一个缺失的对象,因为regexp不知道源应该是两个不同的字符串。如果这是一个潜在的问题,那么搜索分隔字符

的出现。

你调用将字符串分割成一个数组

var aStr1 = str1.split('');
var aStr2 = str2.split('');

然后检查哪个字符更多,并保存较小的数字

var totalCharacters;
if(aStr1.length > aStr2.length) {
    totalCharacters = aStr2.length
} else {
    totalCharacters = aStr1.length
}

和循环比较

var diff = [];
for(var i = 0; i<totalCharacters; i++) {
   if(aStr1[i] != aStr2[i]) {
      diff.push(aStr1[i]); // or something else
   }
}

在最后,您可以连接较大字符串中的最后一个字符(因为它们显然与另一个不同)。

它对你有帮助吗?