1. 程式人生 > >Java將字串變成對應正則

Java將字串變成對應正則

    有時候, 我們不想動腦筋根據某個內容來寫對應正則, 這個時候, 我們就想, 如果直接把這段子串複製一下, 得到對應的正則該多好.為了多偷一會懶, 所以寫一個簡單的實現.

    大家都是明白人, 直接上程式碼, 有些說明我已經寫在註釋裡面了, 原理很簡單, 一看就懂.

   

package com.ysm.parse;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @description: 正則串 集合類
 * @author: Wonder
 * @create: 2018-08-15 09:55
 **/
public class NewPatterns {

    private static List<Pattern> patternItems = new ArrayList<>();

    static {
        /**
         * 按照 自己想要的順序將正則新增進列表
         */
        patternItems.add(Pattern.compile("\\d"));
        patternItems.add(Pattern.compile("\\w"));
        patternItems.add(Pattern.compile("\\s"));
        patternItems.add(Pattern.compile("\\d+"));
        patternItems.add(Pattern.compile("[a-zA-Z]+"));
        patternItems.add(Pattern.compile("\\w+"));
        patternItems.add(Pattern.compile("\\s+"));
    }

    /**
     * 遍歷獲得符合的正則串
     * @param con
     * @return
     */
    private static Pattern getPattern(String con){
        Pattern ptn = null;
        for (Pattern item : patternItems){
            Matcher m = item.matcher(con);
            if (m.lookingAt()){
                if (con.equals(m.group())){
                    ptn =  item;
                    break;
                }
            }
        }
        return ptn;
    }

    /**
     * 通過遍歷匹配, 組裝各部分的正則表示式
     * @param content
     * @return
     */
    public static String parsePattern(String content){
        List<String> tmp = split(content);
        StringBuilder sb = new StringBuilder();
        for (String s : tmp){
            //System.out.println("s: "+s);
            Pattern pth = getPattern(s);
            if (pth == null){
                sb.append(s);
            }else {
                sb.append(getPattern(s).pattern());
            }
        }
        return sb.toString();
    }

    /**
     * 分詞: 簡單起見只劃分了字母陣列和其他字元
     * @param content
     * @return
     */
    public static List<String> split(String content){
        List<String> tmp = new ArrayList<>(16);
        char[] chars = content.toCharArray();
        int tp = 0;
        for (int i=0;i<chars.length;i++){
            StringBuilder word = new StringBuilder();
            tp = getCharType(chars[i]);
            for (int j=i;j<chars.length;j++){
                int type = getCharType(chars[j]);
                if(type != tp){
                    tmp.add(word.toString());
                    i=j-1;
                    break;
                }
                word.append(chars[j]);
                if (j == chars.length-1){
                    tmp.add(word.toString());
                    i=j;
                    break;
                }
            }
        }
        return tmp;
    }

    /**
     * 給 字元 分類
     * 0 - 其他字元
     * 1 - 數字
     * 2 - 字母
     *
     * @param c
     * @return
     */
    private static int getCharType(char c){
        if(c>=48 && c<=57){
            return 1;
        }else if((c>=65 && c<=90) || (c>=97 && c<=122)){
            return 2;
        }else {
            return 0;
        }
    }

    public static void main(String[] args){
        String ptn = "2018-08-15";
        System.out.println("子串: "+ptn);
        String patternGet = parsePattern(ptn);
        System.out.println("正則: "+patternGet);

        System.out.println();

        String content = "我於 2018-08-15 在部落格上寫了一遍文章.";
        Pattern pattern = Pattern.compile(patternGet);
        Matcher m = pattern.matcher(content);
        System.out.println("原文: "+content);
        if (m.find()){
            System.out.println("找到: "+m.group());
        }
    }
}

執行一下: 

 

這個程式碼可以說是相當Easy了, 如果哪位大神有更高逼格的正則解析方法, 請私信發我一哈, 技術是通過交流提高的.