JavaScript中兩個字符串的匹配

字號:


    本文分享JavaScript中兩個字符串的匹配的一個實例代碼,希望能給大家做一個參考。
    工作中遇到一個問題,兩個字符串匹配,要求:每個字符串中最多含有一個*,?可以無限多個
    *代表一個任意長度的字符串,而?則代表一個字符
    要求可以提示出兩個沖突
    代碼如下:
    <input type="text" id="str1"><br>
    <input type="text" id="str2"><br>
    <input type="button" onclick="checkMarchX()" value="CHECK">
    用JavaScript實現(xiàn)代碼如下:
    代碼如下:
    function checkMarchX()
    {
        var str1 = document.getElementById('str1').value;
        var str2 = document.getElementById('str2').value;
        var str1XPosition = str1.indexOf('*');
        var str2XPosition = str2.indexOf('*');
        if(str1XPosition!=-1 && str2XPosition!=-1)//兩者都含有*
        {
            var position = str1XPosition>str2XPosition?str2XPosition:str1XPosition;//success
            if(position!=0)
            {
                var patbeforeStr1 = str1.substring(0,position);
                var patbeforeStr2 = str2.substring(0,position);
                if(checkMarchQ(patbeforeStr1,patbeforeStr2))
                {
                    //alert(str1+'與'+str2+"前半部分沖突");
                    //然后對應后半部分進行測試
                    var str1XBackPosition = str1.length-str1XPosition-1;
                    var str2XBackPosition = str2.length-str2XPosition-1;
                    var backposition = str1XBackPosition>str2XBackPosition?str2XBackPosition:str1XBackPosition;
                    if (backposition==0)
                    {
                        alert(str1+'與'+str2+"沖突");
                    }
                    else
                    {
                        var patbackStr1 = str1.substring(str1.length-backposition,str1.length);
                        var patbackStr2 = str2.substring(str2.length-backposition,str2.length);
                        if(checkMarchQ(patbackStr1,patbackStr2))
                        {
                            alert(str1+'與'+str2+"沖突");
                        }
                    }
                }
            }
            else
            {
                //alert(str1+'與'+str2+"前半部分沖突");
                var str1XBackPosition = str1.length-str1XPosition-1;
                var str2XBackPosition = str2.length-str2XPosition-1;
                var backposition = str1XBackPosition>str2XBackPosition?str2XBackPosition:str1XBackPosition;
                if (backposition==0)
                {
                    alert(str1+'與'+str2+"沖突");
                }
                else
                {
                    var patbackStr1 = str1.substring(str1.length-backposition,str1.length);
                    var patbackStr2 = str2.substring(str2.length-backposition,str2.length);
                    if(checkMarchQ(patbackStr1,patbackStr2))
                    {
                        alert(str1+'與'+str2+"沖突");
                    }
                }
            }
        }
        else if((str1XPosition==-1 && str2XPosition!=-1)||(str1XPosition!=-1 && str2XPosition==-1))//有且只有一個字符串含有*
        {
            var strX = str1XPosition==-1?str2:str1;//含有*的字符串
            var strNoX = str1XPosition==-1?str1:str2;//不含*的字符串
            if (strX.length-1<strNoX.length)
            {
                var position = strX.indexOf('*');
                if(position==0)
                {
                    //alert(str1+'與'+str2+"前半部分沖突");
                    var backposition = strX.length-position-1;
                    if (backposition==0)
                    {
                        alert(str1+'與'+str2+"沖突");
                    }
                    else
                    {
                        var patbackStr1 = str1.substring(str1.length-backposition,str1.length);
                        var patbackStr2 = str2.substring(str2.length-backposition,str2.length);
                        if(checkMarchQ(patbackStr1,patbackStr2))
                        {
                            alert(str1+'與'+str2+"沖突");
                        }
                    }
                }
                else
                {
                    var patbeforeStr1 = str1.substring(0,position);
                    var patbeforeStr2 = str2.substring(0,position);
                    if(checkMarchQ(patbeforeStr1,patbeforeStr2))
                    {
                        //alert(str1+'與'+str2+"前半部分沖突");
                        var backposition = strX.length-position-1;
                        if (backposition==0)
                        {
                            alert(str1+'與'+str2+"沖突");
                        }
                        else
                        {
                            var patbackStr1 = str1.substring(str1.length-backposition,str1.length);
                            var patbackStr2 = str2.substring(str2.length-backposition,str2.length);
                            if(checkMarchQ(patbackStr1,patbackStr2))
                            {
                                alert(str1+'與'+str2+"沖突");
                            }
                        }
                    }
                }
            }
        }
        else
        {
            if(checkMarchQ(str1,str2))
            {
                alert(str1+'與'+str2+"沖突");
            }
        }
    }
    function checkMarchQ(str1,str2)
    {
        var flagque = false;
        if(str1.length==str2.length)
        {
          //長度相同才有可能沖突
            for (var i=0 ;i<str1.length ;i++ )
            {
                if(str1.substr(i,1)!='?' && str2.substr(i,1)!='?')
                {
                    if(str1.substr(i,1)!=str2.substr(i,1))
                    {
                        flagque = false;//表示不沖突
                        break;
                    }
                    else
                    {
                        flagque = true;//表示沖突
                    }
                }
            }
        }
        return flagque;
    }
    其中*最起碼為一個字符,以上程序并沒有對輸入的合法性進行驗證