使用正则表达式查找Javascript中两个字符串之间的差异

时间:2015-04-11 03:19:25

标签: javascript regex

正则表达专家请帮助看看这个问题是否可以通过正则表达式来解决:

给定字符串1是任何字符串

字符串2是包含字符串1的所有部分的任何字符串(但不是简单匹配 - 我将举例说明)

如何使用正则表达式将字符串2中字符串1的所有部分替换为空白,以便剩下的字符串不在字符串1中?

例如: str1 ="测试xyz&#34 ;; str2 ="测试ab xyz"

我想" AB"或者" ab"背部。我可以写什么正则表达式,这样当我在str2上运行替换函数时,它将返回" AB"

这是一些非正则表达式代码:

            function findStringDiff(str1, str2) {
                var compareString = function(str1, str2) {
                    var a1 = str1.split("");
                    var a2 = str2.split("");
                    var idx2 = 0;
                    a1.forEach(function(val) {
                        if (a2[idx2] === val) {
                          a2.splice(idx2,1);
                        } else {
                            idx2 += 1;
                        }
                    });
                    if (idx2 > 0) {
                        a2.splice(idx2,a2.length);
                    }
                    return a2.join("");
                }

                if (str1.length < str2.length) {
                    return compareString(str1, str2);
                } else {
                    return compareString(str2, str1);
                }
            }

            console.log(findStringDiff("test xyz","test ab xyz"));

4 个答案:

答案 0 :(得分:13)

正则表达式只识别字符串是否与某个模式匹配。他们没有足够的灵活性来进行比较,就像你要求的那样。您必须获取第一个字符串并基于它构建常规语言以识别第二个字符串,然后使用匹配组来获取第二个字符串的其他部分并将它们连接在一起。这是以可读的方式完成我认为你想要的东西。

//assuming "b" contains a subsequence containing 
//all of the letters in "a" in the same order
function getDifference(a, b)
{
    var i = 0;
    var j = 0;
    var result = "";

    while (j < b.length)
    {
        if (a[i] != b[j] || i == a.length)
            result += b[j];
        else
            i++;
        j++;
    }
    return result;
}

console.log(getDifference("test fly", "test xy flry"));

这是一个jsfiddle:http://jsfiddle.net/d4rcuxw9/1/

答案 1 :(得分:1)

我发现这个问题非常有趣。即使我有点迟了,我想分享我的解决方案,如何使用正则表达式实现这一目标。解决方案简洁但不易阅读。

虽然我喜欢它的简洁性,但我可能不会将它用于我的代码,因为它的不透明度会降低可维护性。

var str1 = "test xyz",
    str2 = "test ab xyz"
    replacement = '';
var regex = new RegExp(str1.split('').map(function(char){
    return char.replace(/[.(){}+*?[|\]\\^$]/, '\\$&');
}).join('(.*)'));
if(regex.test(str2)){
    for(i=1; i<str1.length; i++) replacement = replacement.concat('$' + i);
    var difference = str2.replace(regex, replacement);
} else {
    alert ('str2 does not contain str1');
}

"test xyz"的正则表达式为/t(.*)e(.*)s(.*)t(.*) (.*)x(.*)y(.*)z/replacement"$1$2$3$4$5$6$7"

代码不再简洁,但即使str1包含特殊字符,它现在也能正常工作。

答案 2 :(得分:-2)

要了解是否有额外的&#39;。&#39;就像你要求的那样,你可以这样做:

result = "$1...00".match(/\$1\.(\.*)?00/)[1];

result然后发现了EXTRA&#39;。您不能使用正则表达式仅使用正则表达式来比较字符串。也许使用它,然后比较结果。

你也可以试试这个:

result = "$1...00".match(/(\$)(\d+)\.(\.*)?(\d+)/);
// Outputs: ["$1...00", "$", "1", "..", "00"]

将提取要比较的各个部分。

答案 3 :(得分:-2)

如果您只关心测试给定字符串是否包含两个或更多连续点&#39;。&#39;字符:

&#13;
&#13;
var string = '$1..00',
    regexp = /(\.\.+)/;

alert('Is this regular expression ' + regexp + ' found in this string ' + string + '?\n\n' + regexp.test(string) + '\n\n' + 'Match and captures: ' + regexp.exec(string));
&#13;
&#13;
&#13;

如果您需要它以匹配货币格式:

&#13;
&#13;
var string = '$1..00',
    regexp = /\$\d*(\.\.+)(?:\d\d)+/;

alert('Is this regular expression ' + regexp + ' found in this string ' + string + '?\n\n' + regexp.test(string) + '\n\n' + 'Match and captures: ' + regexp.exec(string));
&#13;
&#13;
&#13;

但我告诫你,正则表达式不能比较两个字符串之间的差异;它们用于定义与给定字符串匹配的模式。

所以,虽然这可以直接回答如何找到&#34;多个点&#34;对于&#34;找到两个字符串之间的区别&#34;。

是没用的

StackOverflow标记wiki为RegEx提供了一个很好的概述和基本参考。请参阅:https://stackoverflow.com/tags/regex/info