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了, 如果哪位大神有更高逼格的正则解析方法, 请私信发我一哈, 技术是通过交流提高的.

猜你喜欢

转载自blog.csdn.net/weixin_41771503/article/details/81700586