Java將字串變成對應正則
阿新 • • 發佈:2018-11-12
有時候, 我們不想動腦筋根據某個內容來寫對應正則, 這個時候, 我們就想, 如果直接把這段子串複製一下, 得到對應的正則該多好.為了多偷一會懶, 所以寫一個簡單的實現.
大家都是明白人, 直接上程式碼, 有些說明我已經寫在註釋裡面了, 原理很簡單, 一看就懂.
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了, 如果哪位大神有更高逼格的正則解析方法, 請私信發我一哈, 技術是通過交流提高的.