经过很久的努力,终于完成了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();
} }

看了,请务必回复!!!这是对我的支持,我会继续努力!

JAVA自动生成正则表达式工具类的更多相关文章

  1. java随机生成字符串工具类

    package aA; import java.util.ArrayList; import java.util.Arrays; import java.util.Random; /** * 字符随机 ...

  2. 正则表达式工具类,正则表达式封装,Java正则表达式

    正则表达式工具类 正则表达式封装 Java正则表达式 >>>>>>>>>>>>>>>>>>& ...

  3. Unity 自动生成组件索引类工具

    Unity 自动生成组件索引类工具 需求由来 我们在写UI类时 需要获取预设中的组件 joystick = transform.Find("joystick"); backgrou ...

  4. java中常用的工具类(三)

    继续分享java中常用的一些工具类.前两篇的文章中有人评论使用Apache 的lang包和IO包,或者Google的Guava库.后续的我会加上的!谢谢支持IT江湖 一.连接数据库的综合类       ...

  5. Java 后台验证的工具类

    Java 后台验证的工具类 public class ValidationUtil {         //手机号     public static String mobile = "^( ...

  6. Android 自动生成的R类

    资源文件的使用分为在代码中使用和在其他资源文件中引用该资源文件.在我们编译一个Android应用时,Android会自动生成一个R类,在该类中根据不同的资源类型又生成了相应的内部类,该类包含了系统中使 ...

  7. Java学习-041-颜色工具类(RGB,HEX)

    在日常的网页开发中,经常需要进行颜色数值获取.转换,例如获取红色,获取蓝色,获取绿色,RGB转十六进制颜色,十六进制颜色转RGB等,因而在学习过程中,写了一个小工具类,仅供各位小主参考! 多不闲言,直 ...

  8. Mybatis上路_06-使用Java自动生成[转]

    Mybatis上路_06-使用Java自动生成 11人收藏此文章, 我要收藏发表于1个月前(2013-04-24 23:05) , 已有151次阅读 ,共0个评论 目录:[ - ] 1.编写Gener ...

  9. Java学习-049-正则工具类

    自去年九月份决定再次入学和职业资格进阶,开始备战二者考试至今,以及当下进行中的职称申请,犹如孤独的狼,不断前行在路上,而今凡凡总总的已历8月... 不感慨了,如下为一园友需要的正则工具类,直接上码: ...

随机推荐

  1. Jquery 操作Html 控件 CheckBox、Radio、Select 控件

    在使用 Javascript 编写前台脚本的时候,经常会操作 Html 控件,比如 checkbox.radio.select,用 Jquery 库操作其他会方便很多,下面用Jq对这些控件的操作进行一 ...

  2. Android开发之ADT中无Annotation Processin的解决办法

    使用ButterKnife的时候,进入ADT中设置的时候发现在Java Compiler展开后无Annotation Processin 解决办法: 安装插件:Juno - http://downlo ...

  3. apache开源项目--kylin

    Kylin 是一个开源的分布式的 OLAP 分析引擎,来自 eBay 公司开发,基于 Hadoop 提供 SQL 接口和 OLAP 接口,支持 TB 到 PB 级别的数据量. Kylin 是: 超级快 ...

  4. javascript--苹果系统底部菜单--详细分析(转)

    源码下载:http://pan.baidu.com/s/1hqvJJA8 代码来源: 这个DEMO来自“妙味课堂” 昨天看到了“妙味课堂”的一个苹果菜单的DEMO.根据里面提到的“勾股定理”.我自己分 ...

  5. MVC3系列~Html.BeginForm与Ajax.BeginForm

    Html.BeginForm与Ajax.BeginForm都是MVC架构中的表单元素,它们从字面上可以看到区别,即Html.BeginForm是普通的表单提交,而Ajax.BeginForm是支持异步 ...

  6. [备忘]WCF中使用MessageContract的一些注意点

    准备使用WCF完成上传文件,以取代之前HTTP POST的方式. 但是调试了很久一直报错,后来经过一些修改终于通过,以下是一些可能需要注意的地方: 1.在WCF服务的OperatorContract ...

  7. 基于WebForm+EasyUI的业务管理系统形成之旅 -- 系统设置(Ⅰ)

    上篇<基于WebForm+EasyUI的业务管理系统形成之旅 -- 总体介绍>,主要介绍系统总体的界面效果和用户体验UI设计. 在MVC.MVP大行其道的今天,写WebForm该系列篇章, ...

  8. java基础之运算符

    运算符是用于表示数据的赋值,运算和比较的一种特殊符号.1.赋值运算符:=,+=,-=,*=,/=,%= x=1;x+=2;(相当于x=x+2,等于3),其他运算符同理 2.算术运算符:+,-,*,/, ...

  9. 【原】本地win7,远程服务器XP系统,两台机器间不能拖动文件

    (1)网上大部分说是rdpclip.exe(存放在c:/windows/system32)的问题,试了好几次,没有解决 (2)通过第二种方式解决,详细步骤如下所示: 1.点击进入远程连接. 2.选择本 ...

  10. 韦东山yy公开课笔记(2)--各种杂的问题

    1. 编译器的版本和glibc库有对应关系吗,如何查看glibc的版本(glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc),编译器是不是只带glibc被编译生成的 . ...