java字串星號、問號匹配問題解決方案

來源:互聯網
上載者:User

先談談。號(問號的處理比較簡單)
   用for 迴圈進行逐一比較就可以了。

*號的處理,就比較複雜了。在這裡,我採用的是 左迭歸思想進行匹配。由於鄙人文學較差,不好對代碼進行解釋。就請大家自行看看代碼裡的注釋吧。(雖然少,不過關鍵地方都寫了)

public class myString {
    String str=null;
    myString(String value){str=value;}    
    
    public boolean isLike(String regex)
    {
        if(regex.indexOf("?")!=-1)return WenHao(regex);
        else if(regex.indexOf("*")!=-1)return XingHao(str,regex);
        return false;
    }
    
    private boolean WenHao(String regex)
    {
        // ?號匹配
        if(str.length()!=regex.length())return false;
        for(int i=0;i<regex.length();i++)
            if(str.charAt(i)!=regex.charAt(i) && regex.charAt(i)!='?')
            return false;        
        return true;
    }
        
    private boolean XingHao(String Str,String regex)
    {
        // *號匹配
        int Lstr=Str.length();
        int Lreg=regex.length();
        int x1=regex.indexOf("*");
        switch(x1)
        {
        case -1:{
            //x1=-1    regex 中沒有 * 號,不需要跌歸計算
            if(Lstr==Lreg)
            {
                if(Lstr==0)return true;
                for(int kk=0;kk<Lreg;kk++)//檢測字串是否匹配
                   if(Str.charAt(kk)!=regex.charAt(kk))return false;
                return true;                
            }else
                return false;
        }
        case 0:
        {//x1=0 regex 中 * 號在首位
            if(Lreg==1)return true;//只有一個星號,自然是匹配的,如 regex="*"
            boolean right=false;
            int p=0;
            // *號在首位,定位 * 號 後一位
            for(int k=0;k<Lstr;k++)
                if(Str.charAt(k)==regex.charAt(x1+1)||regex.charAt(x1+1)=='*')
                {p=k;right=true;break;}//遇到 ** 就直接 right=true;
            if(right==false)return false;
            else
            {
                if(p==Lstr)return true;
                return XingHao(Str.substring(p,Lstr),regex.substring(x1+1,Lreg));
            }    
        }
        default:
        {    //x1>0
            for(int i=0;i<x1;i++)
                if(Str.charAt(i)!=regex.charAt(i))return false;
            return XingHao(Str.substring(x1,Lstr),regex.substring(x1,Lreg));
        }
        }        
    }
    
    
    
    public static void main(String[] args) {
        
        System.out.println("str=ABCD regex=ABC? :"+new myString("ABCD").isLike("ABC?"));
        System.out.println("str=ABCD regex=A??? :"+new myString("ABCD").isLike("A???"));
        System.out.println("str=ABCD regex=A?? :"+new myString("ABCD").isLike("A??"));
        System.out.println("str=ABCD regex=?BC? :"+new myString("ABCD").isLike("?BC?"));
        System.out.println("str=ABCD regex=*B*D :"+new myString("ABCD").isLike("*B*D"));
        System.out.println("str=ABCD regex=*BCD :"+new myString("ABCD").isLike("*BCD"));
        System.out.println("str=ABCD regex=*A*B*D :"+new myString("ABcCD").isLike("*A*B*D"));       
        
    }

}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.