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

时间:2014-08-06 16:28:35

标签: javascript regex string compare

现在我有两个字符串,

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

我打算做的是告诉他们之间的区别,结果看起来像是

A10B1C101D11

A10 B22 C101 D110E1

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

2 个答案:

答案 0 :(得分:1)

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

但是 可以 使用Regexp执行此操作,但在javascript中,您会因缺乏外观而受到阻碍。

执行此操作的方法是使用否定前瞻来防止包含在另一个字符串中的匹配。但是,由于javascript不支持lookbehind,您可能需要从两个方向进行搜索。

我们通过使用我们可以测试的分隔符连接字符串来完成此操作。

如果使用'|'作为分隔符,正则表达式成为;

/(\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将不会被视为具有丢失的对象,因为正则表达式不知道源应该是两个不同的字符串。如果这是一个潜在的问题,那么搜索分隔字符的出现。

答案 1 :(得分:0)

您调用将字符串分解为数组

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
   }
}

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

对你有帮助吗?