JAVA自動生成正則表達式工具類


  經過很久的努力,終於完成了JAVA自動生成正則表達式工具類。還記得之前需要正則,老是從網上找嗎?找了想修改也不會修改。現在不用再為此煩惱了,使用此生成類輕松搞定所有正則表達式。趕快在同事面前炫一下吧。

  本正則表達式工具類,也整理了很多常用校驗。例如:匹配漢字、行首、行尾、匹配除換行外的所有字符、匹配數字、匹配大寫字母、匹配小寫字母、匹配大小寫字母、匹配小寫字母和數字、匹配大寫字母和數字、匹配大小寫字母和數字、匹配大小寫字母、數字、下划線、匹配一個單詞的邊界、匹配一個非單詞的邊界、匹配任何空白字符,包括空格、制表符、換頁符等。與 [ \f\n\r\t\v] 等效。、匹配任何非空白字符。與 [^ \f\n\r\t\v] 等效。、匹配任何字類字符,包括下划線。與"[A-Za-z0-9_]"等效。、與任何非單詞字符匹配。與"[^A-Za-z0-9_]"等效。

  本工具類,你可以使用append()追加規則,or()或一個其他規則,repeat設置重復規則,讓你方便生成正則表達式。

     下面為一個生成郵箱正則的例子,匹配規則為:郵箱名允許大小寫字母數字下划線,域名可以含數字、大小寫字母、點、下划線,如果有些郵箱要求不同,可自行修改。

//驗證郵箱總規則。
        //郵箱名允許大小寫字母數字下划線,域名可以含數字、大小寫字母、點、下划線,如果有些郵箱要求不同,可自行修改。
        RegexUtil r=new RegexUtil();
        //@之前規則
        RegexUtil before=new RegexUtil(RegexUtil.letterAndNumAndUnderLine);//允許大小寫字母和下划線
        before.repeatOneOrMore();//允許重復1-N次
        r.append(before);//將@之前的規則追加到總規則
        r.append("@");//追加上@符號
        
        //@之后到最后一個域名點之前的規則
        RegexUtil after=new RegexUtil(RegexUtil.letterAndNumAndUnderLine);//允許大小寫字母和下划線
        after.or(".");//允許點,防止郵箱二級域名,如:@vip.qq.com
        after.or("-");//域名中允許橫線
        after.repeatOneOrMore();//允許重復1-N次
        r.append(after);//追加到總規則
        //頂級域名前的點
        r.append(".");
        
        //頂級域名的規則
        RegexUtil last=new RegexUtil(RegexUtil.lowLetter);//頂級域名只允許小寫字母
        last.repeatOneOrMore();////允許重復1-N次
        r.append(last);
        System.out.println(r);//打印總正則:[a-zA-Z0-9_]+@[a-zA-Z0-9_\.-]+\.[a-z]+
        
        Pattern p = Pattern.compile(r.toString());
        Matcher m = p.matcher("862990787@qq.com");
        System.out.println(m.matches());

最后我貼出來這個自動生成正則的工具類,歡迎大家拍磚啊!

/**
 * 正則表達式生成工具類
 * @author 朱志傑 QQ:862990787
 */
public class RegexUtil {
    //記錄拼接的表達式
    private StringBuffer sb=new StringBuffer();
    //正則表達式的特殊字符,需要進行轉義處理
    private String expectChar=".+*\\$^?{}()[]\\|";
    
    /**
     * 匹配漢字
     */
    public static RegexUtil chinese=new RegexUtil("[\u4e00-\u9fa5]");
    
    /**
     * 行首
     */
    public static RegexUtil lineHead=new RegexUtil("$");
    
    /**
     * 行尾
     */
    public static RegexUtil lineTail=new RegexUtil("^");
    
    /**
     * 匹配除換行外的所有字符
     */
    public static RegexUtil anyButLine=new RegexUtil(".");
    
    /**
     * 匹配數字
     */
    public static RegexUtil num=new RegexUtil("[0-9]");
    
    /**
     * 匹配大寫字母
     */
    public static RegexUtil upperLetter=new RegexUtil("[A-Z]");
    
    /**
     * 匹配小寫字母
     */
    public static RegexUtil lowLetter=new RegexUtil("[a-z]");
    
    /**
     * 匹配大小寫字母
     */
    public static RegexUtil letter=new RegexUtil("[a-zA-Z]");
    
    /**
     * 匹配小寫字母和數字
     */
    public static RegexUtil lowLetterAndNum=new RegexUtil("[a-z0-9]");
    
    
    /**
     * 匹配大寫字母和數字
     */
    public static RegexUtil upperLetterAndNum=new RegexUtil("[A-Z0-9]");
    
    
    /**
     * 匹配大小寫字母和數字
     */
    public static RegexUtil letterAndNum=new RegexUtil("[a-zA-Z0-9]");
    
    /**
     * 匹配大小寫字母、數字、下划線
     */
    public static RegexUtil letterAndNumAndUnderLine=new RegexUtil("[a-zA-Z0-9_]");
    
    /**
     * 匹配一個單詞的邊界
     */
    public static RegexUtil boundary=new RegexUtil("\\b");
    
    /**
     * 匹配一個非單詞的邊界
     */
    public static RegexUtil notBoundary=new RegexUtil("\\B");
    
    /**
     * 匹配任何空白字符,包括空格、制表符、換頁符等。與 [ \f\n\r\t\v] 等效。
     */
    public static RegexUtil blank=new RegexUtil("\\s");
    
    /**
     *     匹配任何非空白字符。與 [^ \f\n\r\t\v] 等效。
     */
    public static RegexUtil notBlank=new RegexUtil("\\s");
    
    /**
     *     匹配任何字類字符,包括下划線。與"[A-Za-z0-9_]"等效。
     */
    public static RegexUtil anyChar=new RegexUtil("\\w");
    
    /**
     * 與任何非單詞字符匹配。與"[^A-Za-z0-9_]"等效。
     */
    public static RegexUtil notAnyChar=new RegexUtil("\\W");
    
    public RegexUtil(){
        
    }
    
    /**
     * 構造時就傳入一個正則表達式
     * @param regex 正則表達式
     */
    public RegexUtil(String regex){
        sb=new StringBuffer(regex);
    }
    
    /**
     * 構造時就傳入一個RegexUtil
     * @param regex 正則表達式
     */
    public RegexUtil(RegexUtil regex){
        sb=new StringBuffer(regex.toString());
    }
    
    /**
     * 執行最短匹配
     */
    public void minMatch(){
        //判斷最外面是否是中括號,不是加上中括號
        sb=addMidBracketIfNo(sb);
        sb.append("?");
    }
    
    /**
     * 重復0-N次,等效於 {0,}。
     */
    public void repeatZeroOrMore(){
        //判斷最外面是否是中括號,不是加上中括號
        sb=addMidBracketIfNo(sb);
        sb.append("*");
    }
    
    /**
     * 重復0或1次,等效於 {0,1}或?。
     */
    public void repeatZeroOrOne(){
        //判斷最外面是否是中括號,不是加上中括號
        sb=addMidBracketIfNo(sb);
        sb.append("?");
    }
    
    /**
     * 重復1-N次,等效於 {1,}。
     */
    public void repeatOneOrMore(){
        //判斷最外面是否是中括號,不是加上中括號
        sb=addMidBracketIfNo(sb);
        sb.append("+");
    }
    
    /**
     * 重復num次
     * @param num 次數
     */
    public void repeat(int num){
        //判斷最外面是否是中括號,不是加上中括號
        sb=addMidBracketIfNo(sb);
        sb.append("{"+num+"}");
    }
    
    /**
     * 重復min-max次
     * @param min 最小
     * @param max 最大
     */
    public void repeat(int min,int max){
        //判斷最外面是否是中括號,不是加上中括號
        sb=addMidBracketIfNo(sb);
        sb.append("{"+min+","+max+"}");
    }
    
    /**
     * 至少重復num次
     * @param num 次數
     */
    public void repeatMin(int num){
        //判斷最外面是否是中括號,不是加上中括號
        sb=addMidBracketIfNo(sb);
        sb.append("{"+num+",}");
    }
    
    /**
     * 若字符串兩邊不是中括號增加上中括號
     * @param sb 原StringBuffer
     * @return StringBuffer
     */
    private StringBuffer addMidBracketIfNo(StringBuffer sb) {
        if(!chkMidBracket(sb)){
            return addMinBrackets(sb);
        }else{
            return sb;
        }
    }
    
    /**
     * 字符串兩邊加上()
     * @param str 字符串
     * @return StringBuffer
     */
    private StringBuffer addMinBrackets(StringBuffer str){
        return new StringBuffer("("+str+")");
    }
    
    /**
     * 字符串兩邊加上[]
     * @param str 字符串
     * @return StringBuffer
     */
    private StringBuffer addMidBrackets(StringBuffer str){
        return new StringBuffer("["+str+"]");
    }
    
    /**
     * 去掉字符串兩邊的[]
     * @param str 字符串
     * @return String
     */
    private String removeMidBrackets(StringBuffer str){
        return str.toString().replaceAll("^\\[", "").replaceAll("\\]$", "");
    }
    
    /**
     * 對字符串里面的特殊字符進行處理
     * @param str 源字符串
     * @return String
     */
    private String handleExpectChar(String str){
        StringBuffer sbTemp=new StringBuffer();
        char[] arr=str.toCharArray();
        
        for(int i=0 ; i<arr.length ; i++){
            if(expectChar.indexOf(arr[i])!=-1){
                sbTemp.append("\\"+arr[i]);
            }else{
                sbTemp.append(arr[i]);
            }
        }
        return sbTemp.toString();
    }
    
    /**
     * 判斷字符串最外圍是否為中括號
     * @param sb
     * @return boolean 是 true,否則 false。
     */
    private boolean chkMidBracket(StringBuffer sb){
        if("[".equals(sb.substring(0, 1)) && "]".equals(sb.substring(sb.length()-1))){
            return true;
        }else{
            return false;
        }
    }
    
    /**
     * 追加一個正則
     * @param re 正則
     */
    public void append(RegexUtil re){
        sb.append(re.toString());
    }
    
    /**
     * 追加一個正則表達式
     * @param String 正則表達式
     */
    public void append(String re){
        sb.append(handleExpectChar(re));
    }
    
    /**
     * 或一個正則
     * @param re 正則
     */
    public void or(RegexUtil re){
        or(re.toString());
    }
    
    /**
     * 或一個正則表達式
     * @param String 正則表達式
     */
    public void or(String re){
        //最外層為中括號
        if(chkMidBracket(sb)){
            //首先去掉兩邊的中括號
            sb=new StringBuffer(removeMidBrackets(sb));
        }
        if(re.length()>1){
            //字符串用|
            sb.append("|"+handleExpectChar(re));
        }else{
            //非字符串直接追加
            sb.append(handleExpectChar(re));
        }
        //追加上中括號
        sb=new StringBuffer(addMidBrackets(sb));
    }
    
    /**
     * 對自己進行否處理
     */
    public void not(){
        sb=new StringBuffer("[^"+sb+"]");
    }

    /**
     * 返回正則表達式
     */
    public String toString(){
        return sb.toString();
    }

}

看了,請務必回復!!!這是對我的支持,我會繼續努力!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM