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

Javascript 如何比较两个字符串并得到不同的部分,javascript,regex,string,compare,Javascript,Regex,String,Compare,现在我有两条弦 var str1 = "A10B1C101D11"; var str2 = "A1B22C101D110E1"; 我想做的是告诉他们之间的区别,结果会是这样的 A10B1C101D11 A10B22C101D110E1 它遵循相同的模式,一个字符和一个数字。如果角色不存在或者他们之间的数字不同,我会说他们不同,并突出显示不同的部分。正则表达式能做到这一点吗?还是其他好的解决方案?提前谢谢 调用将字符串拆分为数组 var aStr1 = str1.split(''); var a

现在我有两条弦

var str1 = "A10B1C101D11";
var str2 = "A1B22C101D110E1";
我想做的是告诉他们之间的区别,结果会是这样的

A10B1C101D11

A10B22C101D110E1


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

调用将字符串拆分为数组

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
   }
}
var diff=[];

对于(var i=0;i让我首先声明,regexp可能不是用于此目的的最佳工具。因为您知道字符串的格式很简单,所以将字符串解析为标记,然后比较标记会更快更安全

然而,您可以使用Regexp来实现这一点,尽管在javascript中由于缺少lookback而受到阻碍

实现这一点的方法是使用负向前看来防止包含在另一个字符串中的匹配。但是,由于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不知道源应该是两个不同的字符串。如果这是一个潜在问题,请搜索出现的定界字符。

很抱歉,我没有解释清楚。这似乎是一个很好的方法来区分两个字符串是不同的,但如何获取不同的部分?这不会回答OP。您将字符与字符进行匹配,当数字的位数不同时,这会导致误报(以及定位误报)。即OP给出的第一个字符串中的C应与第二个字符串中的C匹配,而不是与“B22”中的“2”不同。