`

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();
    }

}
复制代码
分享到:
评论

相关推荐

    精通正则表达式~~~

    精通正则表达式第三版 搜集于网络 前言..........I 第1章:正则表达式入门.... 1 解决实际问题... 2 作为编程语言的正则表达式... 4 以文件名做类比... 4 以语言做类比... 5 正则表达式的知识框架... 6 对于...

    通用的Java工具类,主要包括基础工具类(时间、正则表达式、字符串、随机数等等),excel解析生成、word解析生成、文件操作

    通用的Java工具类,主要包括基础工具类(时间、正则表达式、字符串、随机数等等),excel解析生成、word解析 生成、文件操作

    车架号校验Java工具类

    车架号校验工具类,Java实现代码。通过目前主流的车架号校验规则进行校验。提供车架号校验,以及虚拟车架号生成。车架号生成仅供测试,请勿做他用

    RegexToolbox.JS:适用于JavaScript开发人员的正则表达式工具

    适用于JavaScript开发人员的正则表达式工具。 正则表达式生成器 RegexBuilder是用于使用流利的API以更RegexBuilder方式构建正则表达式的类。 与在字符串中使用原始正则表达式语法相比,它具有许多优点: 不需要...

    Regular Expression Builder for Java-开源

    Java正则表达式生成器(reb4j)是一组简单的类,封装了java.util.regex.Pattern使用的正则表达式,并提供了从子表达式组成较大表达式的工具。

    接口文档实体生成工具

    拥有正则表达式和长度等校验对不能识别的语句 private String version;//版本号 version MAX(20) B2C1.0 in.setInterfaceName("");//接口名称 interfaceName MAX(30) 取值:anonymousPayOrder; private String ...

    常用工具类

    通用的Java工具类,主要包括基础工具类(时间、正则表达式、字符串、随机数等等),excel解析生成、word解析生成、文件操作、图片操作

    J2EE开发全程实录(JAVA项目开发)

    1.2.2 Java中的正则表达式API 5 1.2.3 java.util.regex的使用... 6 1.3 实战正则表达式... 8 第2章 程序最优化.... 14 2.1 空间与时间... 14 2.1.1 空间与时间的概念和度量... 14 2.1.2 空间与时间的背反... 15 ...

    java使用自定义注解处理器实现自动化文档生成.txt

    在这个例子中,我们定义了一系列的正则表达式模式,用于匹配不同类型的注释信息。例如,TITLE_PATTERN用于匹配类名或方法名;CLASS_NAME_PATTERN用于匹配导入的包名;IMPORT_PATTERN用于匹配import语句;FUNCTION_...

    JAVA_API1.6文档(中文)

    java.util.regex 用于匹配字符序列与正则表达式指定模式的类。 java.util.spi java.util 包中类的服务提供者类。 java.util.zip 提供用于读写标准 ZIP 和 GZIP 文件格式的类。 javax.accessibility 定义了用户...

    Java开发技术大全(500个源代码).

    leapYearByLogical.java 用逻辑表达式判断闰年 lowToUpper.java 小写字母转换成大写字母 lozengeStar.java 输出一个由*组成的菱形 multiplyTable.java 求乘法口诀表 narrowingConversion_1.java 缩减转换引发...

    Java编写的一个类C语言编译器(词法分析,语法分析,语义分析和目标代码生成).zip

    - 使用Java的正则表达式或有限自动机理论实现词法分析器,能够将源代码转换为词法单元序列。 - 处理词法错误,如非法字符或格式错误的数字。 2. **语法分析器**: - 定义语法规则,构建上下文无关文法(CFG)。 ...

    Java 1.6 API 中文 New

    java.util.regex 用于匹配字符序列与正则表达式指定模式的类。 java.util.spi java.util 包中类的服务提供者类。 java.util.zip 提供用于读写标准 ZIP 和 GZIP 文件格式的类。 javax.accessibility 定义了用户界面...

    java api最新7.0

    java.util.regex 用于匹配字符序列与正则表达式指定模式的类。 java.util.spi java.util 包中类的服务提供者类。 java.util.zip 提供用于读写标准 ZIP 和 GZIP 文件格式的类。 javax.accessibility 定义了用户界面...

    JavaAPI1.6中文chm文档 part1

    java.util.regex 用于匹配字符序列与正则表达式指定模式的类。 java.util.spi java.util 包中类的服务提供者类。 java.util.zip 提供用于读写标准 ZIP 和 GZIP 文件格式的类。 javax.accessibility 定义了用户...

    Source Insight 4.00.124 安装包

    符号搜索:可以搜索源代码中的符号,包括函数、变量、宏定义等,并支持模糊搜索、正则表达式搜索等。 代码片段管理:可以管理常用的代码片段,包括代码块、函数模板、注释模板等,并支持自定义代码片段。 自动完成:...

    java jdk-api-1.6 中文 chmd

    java.util.regex 用于匹配字符序列与正则表达式指定模式的类。 java.util.spi java.util 包中类的服务提供者类。 java.util.zip 提供用于读写标准 ZIP 和 GZIP 文件格式的类。 javax.accessibility 定义了用户...

    JavaAPI中文chm文档 part2

    java.util.regex 用于匹配字符序列与正则表达式指定模式的类。 java.util.spi java.util 包中类的服务提供者类。 java.util.zip 提供用于读写标准 ZIP 和 GZIP 文件格式的类。 javax.accessibility 定义了用户...

Global site tag (gtag.js) - Google Analytics