經過很久的努力,終於完成了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(); } }
看了,請務必回復!!!這是對我的支持,我會繼續努力!