Java 后台验证的工具类
public class ValidationUtil {
//手机号
public static String mobile = "^((13[0-9])|(14[0-9])|(15[0-9])|(16[0-9])|(17[0-9])|(18[0-9])|(19[0-9]))\\d{8}$";
//不允许为空
public static String blank = ".*[^ ].*";
//邮件
public static String email = "^([a-z0-9A-Z]+[-|_|\\.]?)+[a-z0-9A-Z]@([0-9a-z_\\-]*)(\\.(com|cn|inc|org|cc|edu|de)*){1,2}([a-z]{2})?$";
//QQ,允许为空
public static String tencentQQAllowNull = "((^$)|([1-9][0-9]{4,11}))";
public static String tencentQQ = "[1-9][0-9]{4,11}";
//网址,允许为空
public static String urlAllowNull = "((^$)|(http|https)+://([\\w-]+\\.)+[\\w-]+(/[\\w- ./?%&=]*)?)";
//网址
public static String url = "(http|https)+://([\\w-]+\\.)+[\\w-]+(/[\\w- ./?%&=]*)?";
//微信,允许为空
public static String weixinAllowNull = "((^$)|(^[A-Za-z0-9]\\w{3,60}+$))";
//微信
public static String weixin = "^[A-Za-z0-9]\\w{3,60}+$";
//正整数
public static String PositiveInteger = "^[0-9]*[1-9][0-9]*$";
//年份正则表达式
public static String YearReg = "([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})";
//正整数或非负数
public static String NonnegativeNumber ="^(\\+?[1-9][0-9]*$)|(([0-9]+\\.[0-9]*[0-9][0-9]*))";
//不允许有任何空白
public static String NoAnyEmpty = "^[\\S]{5,30}$";
//日期
public static String DateReg ="^$|^((((1[6-9]|[2-9]\\d)\\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-0?2-(0?[1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-))$";
//是否是Double数字类型
public static boolean isDouble(String value) {
if (value == null) {
return false;
}
Pattern pattern = Pattern.compile("[0-9]*(\\.?)[0-9]*");
return pattern.matcher(value).matches();
}
//是否是Long类型
public static boolean isValidLong(String str) {
try {
Long.parseLong(str);
return true;
} catch (NumberFormatException e) {
}
return false;
}
//是否是Int类型
public static boolean isValidInt(String str) {
try {
Integer.parseInt(str);
return true;
} catch (NumberFormatException e) {
}
return false;
}
public static boolean mobile(String str) {
return validata(str, mobile);
}
public static boolean blank(String str) {
return validata(str, blank);
}
/****
* 不为空,限制长度范围
* @param str
* @param start
* @param end
* @return
*/
public static boolean blankforlenth(String str, int start, int end) {
String reg = "\\S{" + start + "," + end + "}";
return validata(str, reg);
}
/***
* 非负数
* @param str
* @return
*/
public static boolean nonnegativeNumber(String str) {
return validata(str, NonnegativeNumber);
}
/****
* 不允许有任何空白
* @param str
* @return
*/
public static boolean noAnyEmpty(String str) {
return validata(str, NoAnyEmpty);
}
/***
* 日期判断
* @param str
* @return
*/
public static boolean isDateReg(String str) {
return validata(str, DateReg);
}
public static boolean eimail(String str) {
return validata(str, email);
}
public static boolean tencentQQAllNull(String str) {
return validata(str, tencentQQAllowNull);
}
public static boolean tencentQQ(String str) {
return validata(str, tencentQQ);
}
public static boolean webURLAllowNull(String str) {
return validata(str, urlAllowNull);
}
public static boolean webURL(String str) {
return validata(str, url);
}
public static boolean weixinAllowNull(String str) {
return validata(str, weixinAllowNull);
}
public static boolean weixin(String str) {
return validata(str, weixin);
}
public static boolean positiveInteger(String str) {
return validata(str, PositiveInteger);
}
public static boolean isyear(String str) {
return validata(str, YearReg);
}
public static boolean validata(String str, String type) {
Pattern p = Pattern.compile(type);
Matcher m = p.matcher(str);
return m.matches();
}
public static void main(String[] args) {
String xxx = "xxxxx";
System.out.println(blankforlenth(xxx,5, 10));
}
}
概述
- Pattern类的作用在于编译正则表达式后创建一个匹配模式.
- Matcher类使用Pattern实例提供的模式信息对正则表达式进行匹配
- Pattern complie(String regex)
由于Pattern的构造函数是私有的,不可以直接创建,所以通过静态方法compile(String regex)方法来创建,将给定的正则表达式编译并赋予给Pattern类 - String pattern() 返回正则表达式的字符串形式,其实就是返回Pattern.complile(String
regex)的regex参数 - Pattern compile(String regex, int flags) 方法功能和compile(String regex)相同,不过增加了flag参数
- int flags() 返回当前Pattern的匹配flag参数.
flag参数用来控制正则表达式的匹配行为,可取值范围如下:
Pattern类
常用方法及介绍
Stringregex =
"\\?|\\*";
Patternpattern =
Pattern.compile(regex);
StringpatternStr = pattern.pattern();//
返回
\?\*
Pattern.CANON_EQ 当且仅当两个字符的”正规分解(canonical decomposition)”都完全相同的情况下,才认定匹配.比如用了这个标志之后,表达式”a\u030A”会匹配”?”.默认情况下,不考虑”规范相等性(canonical equivalence)”.
Pattern.CASE_INSENSITIVE(?i) 默认情况下,大小写不明感的匹配只适用于US-ASCII字符集.这个标志能让表达式忽略大小写进行匹配.要想对Unicode字符进行大小不明感的匹 配,只要将UNICODE_CASE与这个标志合起来就行了.
Pattern.COMMENTS(?x) 在这种模式下,匹配时会忽略(正则表达式里的)空格字符(译者注:不是指表达式里的”\s”,而是指表达式里的空格,tab,回车之类).注释从#开始,一直到这行结束.可以通过嵌入式的标志来启用Unix行模式.
Pattern.DOTALL(?s)在这种模式下,表达式’.’可以匹配任意字符,包括表示一行的结束符。默认情况下,表达式’.’不匹配行的结束符.
Pattern.MULTILINE(?m)在这种模式下,’\^’和’$’分别匹配一行的开始和结束.此外,’^’仍然匹配字符串的开始,’$’也匹配字符串的结束.默认情况下,这两个表达式仅仅匹配字符串的开始和结束.
Pattern.UNICODE_CASE(?u) 在这个模式下,如果你还启用了CASE_INSENSITIVE标志,那么它会对Unicode字符进行大小写不明感的匹配.默认情况下,大小写不敏感的匹配只适用于US-ASCII字符集.
Pattern.UNIX_LINES(?d) 在这个模式下,只有’\n’才被认作一行的中止,并且与’.’,’^’,以及’$’进行匹配.
- Pattern.matcher(CharSequence input) 对指定输入的字符串创建一个Matcher对象
- String[] split(CharSequence input)
String[] split(CharSequence input, int limit) - String[] split(CharSequence input, int limit)
功能和String[]
split(CharSequence input)相同,增加参数limit目的在于要指定分割的段数 - Pattern.quote(String s) 返回给定的字符串的字面量,关于方法的具体信息请参考123
Pattern pattern = Pattern.compile(
"\\?{2}");
Matcher matcher = pattern.matcher(
"??");
boolean
matches= matcher.
matches();//
true
Stringregex =
"\\?|\\*";
Pattern pattern = Pattern.compile(regex);
String[] splitStrs = pattern.split(
"123?123*456*456");
//123 123 456 456
String[] splitStrs2 = pattern.split(
"123?123*456*456",
2);
// 123 123*456*456
String pattern = Pattern
.quote(
"1252343% 8 567 hdfg gf^$545")
;
System
.out.println(
"Pattern is : "+pattern)
;
输出信息:
Pattern is : \Q1252343% 8 567 hdfg gf^$545\E
- matches()方法编译给定的正则表达式并且对输入的字串以该正则表达式为模开展匹配,该方法适合于该正则表达式只会使用一次的情况,也就是只进行一次匹配工作,因为这种情况下并不需要生成一个Matcher实例.
Stringregex =
"\\?|\\*";
Pattern pattern = Pattern.compile(regex);
boolean
matches= pattern.
matches(regex,
"?");//
返回
true
Matcher类
常用方法及介绍
- boolean matches() 最常用方法:尝试对整个目标字符展开匹配检测,也就是只有整个目标字符串完全匹配时才返回真值.
- boolean lookingAt() 对前面的字符串进行匹配,只有匹配到的字符串在最前面才会返回true
- boolean find() 对字符串进行匹配,匹配到的字符串可以在任何位置
- int start() 返回当前匹配到的字符串在原目标字符串中的位置
- int end() 返回当前匹配的字符串的最后一个字符在原目标字符串中的索引位置.
- String group() 返回匹配到的子字符串
Pattern.start(),Pattern.end(),Pattern.group()代码示例
Pattern pattern = Pattern
.compile(
"\\?{2}")
;
Matcher matcher = pattern
.matcher(
"??")
;
boolean matches = matcher
.matches()
;//true
System
.out.println(matches)
;
matcher=pattern
.matcher(
"?")
;
matches = matcher
.matches()
;//false
System
.out.println(matches)
;
Pattern p = Pattern
.compile(
"\\d+")
;
Matcher m = p
.matcher(
"22bb23")
;
boolean match = m
.lookingAt()
;//true
System
.out.println(match)
;
m = p
.matcher(
"bb2233")
;
match= m
.lookingAt()
;
System
.out.println(match)
;//false
Pattern p = Pattern
.compile(
"\\d+")
;
Matcher m = p
.matcher(
"22bb23")
;
m
.find()
;// 返回true
Matcher m2 = p
.matcher(
"aa2223")
;
m2
.find()
;// 返回true
Matcher m3 = p
.matcher(
"aa2223bb")
;
m3
.find()
;// 返回true
Matcher m4 = p
.matcher(
"aabb")
;
m4
.find()
;// 返回false
Pattern p = Pattern
.compile(
"\\d+")
;
Matcher m = p
.matcher(
"aa22bb23")
;
m
.find()
;
int start = m
.start()
;//2
String group = m
.group()
;//22
int end = m
.end()
;//4
System
.out.println(start)
;
System
.out.println(group)
;
System
.out.println(end)
;
还有一些其他常用的方法,请参考API自行学习或者参考其他博客.
Java正则表达式Pattern.quote()方法详解
标签: java 正则表达式 Pattern quote 字面化
2016年07月27日 22:18:205377人阅读 评论(0) 收藏 举报
分类:
java基础(5)
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yin380697242/article/details/52050023
使用示例
String pattern = Pattern
.quote(
"1252343% 8 567 hdfg gf^$545")
;
System
.out.println(
"Pattern is : "+pattern)
;
· 1
· 2
输出结果为
Pattern is : \Q1252343% 8 567 hdfg gf^$545\E
方法解释
在使用quote()方法之后,原有的字符串s变成了\Qs\E的样式,那么\Q和\E代表什么意思呢?
- \Q 代表字面内容的开始
- \E 代表字面内容的结束
也就是说,调用Patter.quote()方法之后,原有的字符串被\Q..\E包裹,返回后的字符串成了正则字面量.举个例子,正则表达式”.*”表示匹配除“\n”之外的任何字符多次.
Pattern pattern = Pattern
.compile(
".*")
;
Matcher matcher = pattern
.matcher(
"123")
;
boolean matches = matcher
.matches()
;//true
System
.out.println(matches)
;
matcher = pattern
.matcher(
"foo")
;
matches = matcher
.matches()
;//true
System
.out.println(matches)
;
而使用quote()方法,可以把正则表达式”.*”转换为它的字面量,请看下例
String regex = Pattern
.quote(
".*")
;
Pattern pattern = Pattern
.compile(regex)
;
Matcher matcher = pattern
.matcher(
"123")
;
boolean match = matcher
.matches()
;// false
System
.out.println(match)
;
matcher = pattern
.matcher(
"foo")
;// false
System
.out.println(match)
;
matcher = pattern
.matcher(
".*")
;
match = matcher
.matches()
;// true
System
.out.println(match)
;
通过上面例子就可以看出,当使用quote()方法后,将”.*”转换为了它的字面量意思,也就是只能匹配”.*”字符串.用API里面的一句话解释就是Metacharacters or escape sequences in the input sequence will be given no special meaning(使给定的正则表达式没有任何的特殊意义)
Java正则表达式Matcher.group(int group)相关类解析
在Java正则表达式的相关类Matcher中,有如下几个方法:
- int groupCount()
- String group(int group)
- int start(int group)
- int end(int group)
- String group(String name)
- int start(String name)
- int end(String name)
分组group的概念
首先先来看一段代码,理解一下正则表达式中分组的概念
demo1
String text =
"John writes about this, and John writes about that,"+
" and John writes about everything. ";
String patternString1 =
"(John)";
Pattern pattern = Pattern
.compile(patternString1)
;
Matcher matcher = pattern
.matcher(text)
;
System
.out.println(
"groupCount is -->"+ matcher
.groupCount())
;
while (matcher
.find()) {
System
.out.println(
"found: "+ matcher
.group(
1))
;
}
输出结果为
groupCount is –>1
found: John
found: John
found: John
demo2
String text =
"John writes about this, and John writes about that,"+
" and John writes about everything. ";
String patternString1 =
"John";
Pattern pattern = Pattern
.compile(patternString1)
;
Matcher matcher = pattern
.matcher(text)
;
System
.out.println(
"groupCount is -->"+ matcher
.groupCount())
;
while (matcher
.find()) {
System
.out.println(
"found: "+ matcher
.group(
1))
;
}
输出结果为:
groupCount is –>0
Exception in thread “main” java.lang.IndexOutOfBoundsException: No group 1
上面两个例子唯一的区别在于patternString1的值不同,具体表现正则表达式一个带有括号,一个不带括号.因此,我们也可以简单的理解为:
正则表达式中以’()’标记的子表达式所匹配的内容就是一个分组(group).
现在我们继续看一个例子
demo3
String text =
"John writes about this, and John writes about that,"+
" and John writes about everything. ";
String patternString1 =
"(?:John)";
Pattern pattern = Pattern
.compile(patternString1)
;
Matcher matcher = pattern
.matcher(text)
;
System
.out.println(
"groupCount is -->"+ matcher
.groupCount())
;
while (matcher
.find()) {
System
.out.println(
"found: "+ matcher
.group(
1))
;
}
输出结果:
groupCount is –>0
Exception in thread “main” java.lang.IndexOutOfBoundsException: No group 1
从demo3中可以看到,类似于(?:pattern)格式的子表达式不能算是一个分组.
因此分组的概念我们总结如下:
1. 正则表达式中以’()’标记的子表达式所匹配的内容就是一个分组(group).
2. 类似于(?:pattern)格式的子表达式不能算是一个分组
分组索引 group number
还是从demo开始
demo4
String text =
"John writes about this, and John Doe writes about that,"
+
" and John Wayne writes about everything.";
String patternString1 =
"(John) (.+?) ";
Pattern pattern = Pattern
.compile(patternString1)
;
Matcher matcher = pattern
.matcher(text)
;
matcher
.find()
;//匹配字符串,匹配到的字符串可以在任何位置
int start = matcher
.start()
;//返回当前匹配到的字符串在原目标字符串中的位置
int end = matcher
.end()
;//返回当前匹配的字符串的最后一个字符在原目标字符串中的索引位置
System
.out.println(
"found group: group(0) is '"+ matcher
.group(
0))
;
System
.out.println(
"found group: group(1) is '"+ matcher
.group(
1) +
"',group(2) is '"+ matcher
.group(
2)+
"'")
;
输出结果为:
found group: group(0) is ‘John writes
found group: group(1) is ‘John’,group(2) is ‘writes’
从输出结果可以看出,当正则表达式包含多个group时,也就是含有多个’(pattern)’格式的子表达式时,它的分组索引(group number)是从1开始的,而group(0)代表了整个匹配的字符串.
为了便于理解具体的分组以及分组编号的概念,请参考下图
通过上面的内容,我们就可以完整理解group(int
group)函数的使用.总结为一下几点:
- 类似于(pattern)格式((?:pattern)除外)的正则子表达式就代表的一个分组
- 分组索引是从1开始的,0代表正则表达式匹配的整个字符串,group(i)代表第i组匹配的内容
- groupCount() 函数返回当前正则表达式中分组的个数
好了,现在来看int start(int group)和int end(int group)两个函数
首先呢,先回顾一下如下两个函数:
1. int start() 返回当前匹配到的字符串在原目标字符串中的位置
2. int end() 返回当前匹配的字符串的最后一个字符在原目标字符串中的索引位置.
那么加上int 类型的参数group后,其实就是返回指定分组的开始索引与结束索 具体如下例:demo5
String text = "John writes about this, and John Doe writes about that,"
+ " and John Wayne writes about everything.";
String patternString1 = "(John) (.+?) ";
Pattern pattern = Pattern.compile(patternString1);
Matcher matcher = pattern.matcher(text);
matcher.find();//
匹配字符串
,
匹配到的字符串可以在任何位置
int
start = matcher.start();//
返回当前匹配到的字符串在原目标字符串中的位置
System.out.println(
start);//0
int
end = matcher.end();//
返回当前匹配的字符串的最后一个字符在原目标字符串中的索引位置
System.out.println(
end);//12
start = matcher.start(1);//
第一个分组匹配的内容
,
也就是
John
开始的索引位置
,0
System.out.println(
start);//0
start = matcher.start(2);//
第一个分组匹配的内容
,
也就是
writes
开始的索引位置
,5
System.out.println(
start);//5
end = matcher.end(1);//
第一个分组匹配的内容
,
也就是
John
结束的索引位置
,4
System.out.println(
end);//4
end = matcher.end(2);//
第二个分组匹配的内容
,
也就是
writes
开始的索引位置
,12
System.out.println(
end);//12
start = matcher.start(3);//Exception in thread "main" java.lang.IndexOutOfBoundsException: No group 3
注意最后一句,当你索引大于正则表达式中实际存在的索引数量,也就是groupCount()返回值是,会抛出异常,所以在使用时记得处理这一点.
综上所述,可总结如下
- int start(int group) 返回当前分组匹配到的字符串在原目标字符串中的位置
- int end(int group) 返回当前分组匹配的字符串的最后一个字符在原目标字符串中的索引位置.
最后呢,就是如下几个函数String
group(String name),int start(String name)和int end(String
name)还没有研究明白,等待后续补充.
Java 后台验证的工具类的更多相关文章
- Java学习-041-颜色工具类(RGB,HEX)
在日常的网页开发中,经常需要进行颜色数值获取.转换,例如获取红色,获取蓝色,获取绿色,RGB转十六进制颜色,十六进制颜色转RGB等,因而在学习过程中,写了一个小工具类,仅供各位小主参考! 多不闲言,直 ...
- JAVA自动生成正则表达式工具类
经过很久的努力,终于完成了JAVA自动生成正则表达式工具类.还记得之前需要正则,老是从网上找吗?找了想修改也不会修改.现在不用再为此烦恼了,使用此生成类轻松搞定所有正则表达式.赶快在同事面前炫一下吧. ...
- Java后台验证
前台的js验证,可以通过其他手段绕过,存在安全问题,所以引入Java后台进行验证 一.导入jar包 此为hibernate-validator jar包,进行Java后台验证使用,在Java 1.9及 ...
- Rhino+envjs-1.2.js 在java运行网站js 工具类
java爬虫遇到个页面加密的东西,找了些资料学习学习 做了个java运行js的工具类,希望对大家有用,其中用到client(获取js)可以自行换成自己的client.主要是用了 Rhino就是Java ...
- java中常用的工具类(一)
我们java程序员在开发项目的是常常会用到一些工具类.今天我汇总了一下java中常用的工具方法.大家可以在项目中使用.可以收藏!加入IT江湖官方群:383126909 我们一起成长 一.String工 ...
- JAVA中封装JSONUtils工具类及使用
在JAVA中用json-lib-2.3-jdk15.jar包中提供了JSONObject和JSONArray基类,用于JSON的序列化和反序列化的操作.但是我们更习惯将其进一步封装,达到更好的重用. ...
- java 二进制数字符串转换工具类
java 二进制数字符串转换工具类 将二进制转换成八进制 将二进制转换成十进制 将二进制转换成十六进制 将十进制转换成二进制 package com.iteye.injavawetrust.ad; i ...
- Java学习-049-正则工具类
自去年九月份决定再次入学和职业资格进阶,开始备战二者考试至今,以及当下进行中的职称申请,犹如孤独的狼,不断前行在路上,而今凡凡总总的已历8月... 不感慨了,如下为一园友需要的正则工具类,直接上码: ...
- java后端时间处理工具类,返回 "XXX 前" 的字符串
转自:https://www.cnblogs.com/devise/p/9974672.html 我们经常会遇到显示 "某个之间之前" 的需求(比如各种社交软件,在回复消息时,显示 ...
随机推荐
- PythonStudy——字典的操作 Dictionary operation
dic = {'a': 1, 'b': 2} print(dic) # 增: 字典名[key] = 值 => key已存在就是修改值,不存在就是新增值 dic['c'] = 3 print(di ...
- eclipse开启时报错问题
eclipse启动时报如下错误: Unable to read workbench state.Workbench UI layout will be reset 不能找到正式的工作台,工作台UI的布 ...
- django 路由系统中name应用
作用:对URL路由关系进行命名, ***** 以后可以根据此名称生成自己想要的URL ***** name的两大应用 url(r'^asdfasdfasdf/', views.index, name= ...
- Python递归调用
递归调用:在调用一个函数过程中,直接或间接又调用该函数本身,称之为递归调用 递归必备的2个阶段 1递推 2回溯 当递推结束后就可以进行回溯了 Python默认设置递归层数为1000 递归示例: de ...
- css3属性box-sizing:border-box 用法解析
响应式Web设计经常需要我们通过百分比设置组件宽度.如果我们不考虑边框,那么很容易就可以实现,但如果你给每一列以及总宽度都采用百分比设置,那这个时候固定的边框大小就会出来捣乱.下面我们将看到一组方法去 ...
- XSY contest1586 proB
题目 现在一圈n个花坛, 每次随机往一个花盆里种花, 一个花盆可以种多颗花, 假如一个花盆两边的花盆都有花, 那么他也将被种上花 问期望种满所有花盆要种几次 首先定义f(i)为放置了i个物品后完全覆盖 ...
- Python2.x 与 Python3.x 共存
一.Python2.x 安装 说明:我们先安装python2.x,默认C盘安装即可. 链接: https://pan.baidu.com/s/1yfsVNKmeOR-2C0fK0rPh4A 密码: x ...
- Java虚拟机-JVM各种参数配置大全详细
usr/local/jdk/bin/java -Dresin.home=/usr/local/resin -server -Xms1800M -Xmx1800M -Xmn300M -Xss512K ...
- Lock的实现原理
1. Lock 的简介及使用 Lock是java 1.5中引入的线程同步工具,它主要用于多线程下共享资源的控制.本质上Lock仅仅是一个接口(位于源码包中的java\util\concurrent\l ...
- crontab自动失效注意事项
若用户密码过期,用户的crontab计划任务会自动失效.重设用户密码修改时间后,crontab会自动恢复. #使用chage -l 查看用户密码过期时间 chage -l user #使用chage ...