【问题标题】:How to compare two Strings and get Different part如何比较两个字符串并获得不同的部分
【发布时间】:2014-08-06 16:28:35
【问题描述】:

现在我有两个字符串,

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

我打算做的是告诉它们之间的区别,结果会是什么样子

A10B1C101D11

A10 B22 C101 D110E1

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

【问题讨论】:

标签: javascript regex string compare


【解决方案1】:

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

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

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

我们通过使用可以测试的分隔符连接字符串来做到这一点。

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

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

【讨论】:

    【解决方案2】:

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

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

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

    对你有帮助吗?

    【讨论】:

    • 这不回答 OP。您将字符匹配到字符,当数字具有不同数量的数字时,这会导致误报(和偶尔的误报)。 IE。 OP 给出的第一个字符串中的 C 应该与第二个字符串中的 C 匹配,而不是与“B22”中的'2'不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多