正则表达式
高散数学是正则的理论基础,有想弄明白的,可以去研究一下。正则是一种简化的验证手段
范例:要求判断一个字符串是否由数字组成。
- 思路:将字符串变为字符数组,而后每个字符进行依次判断。
package cn.mldn.demo;
public class TextDemo {
public static void main(String[] args) throws Exception {
String num = "12a3";
System.out.println(isNumber(num));
}
public static boolean isNumber(String str){
char[] data = str.toCharArray();
for(int x = 0;x<data.length;x++){
if (data[x] >'9' || data[x] < '0'){
return false;
}
}
return true;
}
}
结果:false
如果复杂一点,这样做就显然不划算了
范例:利用正则表达式
package cn.mldn.demo;
public class TextDemo {
public static void main(String[] args) throws Exception {
String num = "12a3";
System.out.println(num.matches("\\d+"));
}
}
发现如果在验证操作上使用正则符号进行匹配,则代码量可以非常少,而“”\\d+””就是正则表达式。
表达式最早是在Liunx下发展起来的,在JDK1.4之前,如果需要使用到正则那么要通过apache下载正则应用包。而从JDK1.4开始,Java正式支持了正则的开发,同时给出了一个java.util.regex开发包,提供正则操作类。
但是需要注意的是,在java.util.regex包里面只提供有两个核心类:
- java.util.regex.Pattem:正则标记编译类;
- java.util.regex.Matcher:正则匹配操作;。
而在开发之中很少去直接使用以上的两个类,一般都使用Sring类完成,因为从JDK1.4之后开始,String类之中有了正则的支持,同时提供了以下支持正则的开发方法。
No | 方法名称 | 类型 | 描述 |
1 | public boolean matches(String regex) | 普通 | 正则验证 |
2 | public String replaceAll(String regex, String replacement) | 普通 | 全部替换 |
3 | public String replaceFirst(String regex, String replacement) | 普通 | 替换首个 |
4 | public String[] split(String regex) | 普通 | 全拆分 |
5 | public String[] split(String regex, int limit) | 普通 | 部分拆分 |
正则符号(背)
要使用正则,就要知道怎么使用一系列的正则匹配符号,而所有的正则匹配符号都在Java.util.regex.Pattern类提供
1、表示单个字符(每出现一个只表示一位)。
- x:表示只能由x组成;
- \\:表示转义字符“\”;
- \t:匹配“tab”键;
- \n:匹配换行;
2、 表示字符的选用范围
- [abc]:表示可能是a、b、c中的任意一个;
- abc]:表示不是a、b、c中的任意一个;。
- [a-zA-Z]:表示任意的一位字母,可能是大写或小写;
- [0-9]:表示任意的一位数字;
3、简化表达式(每出现一个只表示一位)。
- ·:表示任意的一位字符;
- \d:表示是一位数字,相当于“[0-9]”;
- \D:表示不是一位数字,相当于“[^0-9]”;
- \s:表示是任意的一位空格;
- \S:表示不是任意的一位空格;
- \w:表示是大小写字母、数字、_中的任意一位,相当于“[a-zA-Z0-9_]”;
- \W:表示不使大小写字母、数字、中的任意一位,相当于“[a-zA-Z0-9_]”;
4、边界匹配
- ^:写在正则之前,表示正则开始;
- $:写在正则最后,表示正则结束;
5、 数量表示:如果没有数量,每一个出现的标记只能表示一位。
- 正则?:表示此正则规范只能够出现0次或1次;
- 正则*:表示此正则出现0次、1次或多次;
- 正则+:表示此正则出现1次或多次;
- 正则{n}:表示此正则出现正好n次;
- 正则{n}:表示此正则出现n次以上;
- 正则{n,m}:表示此正则出现n~m次;
6、 逻辑操作符
- 正则X正则Y:表示正则X判断后执行正则Y;
- 正则X|正则Y:表示两个正则二选一;
- (正则):包含多个正则,成为一组;
通过String类来操作正则
正则的所有操作方法都是通过String类完成,所以下面通过String类操作正则
范例:字符串替换
package cn.mldn.demo;
public class TextDemo {
public static void main(String[] args) throws Exception {
String num = "jibiy%&*()nh";
String regex = "[^a-zA-Z]";
System.out.println(num.replaceAll(regex,""));
}
}
结果:jibiynh
范例:字符串拆分
package cn.mldn.demo;
public class TextDemo {
public static void main(String[] args) throws Exception {
String num = "aw123449dj9937472xsw";
String regex = "\\d+";
String result[] = num.split(regex);
for(int x = 0; x < result.length; x++) {
System.out.println(result[x]);
}
}
}
结果:aw
dj
xsw
范例:用户名由字母、数字、_组成,要求其范围在6~15位
- 正则:[a-zA-Z0-9_]=\w;
package cn.mldn.demo;
public class TextDemo {
public static void main(String[] args) throws Exception {
String num = "aw123";
String regex = "\\w{6,15}";
System.out.println(num.matches(regex));
}
}
结果:false
范例:学校的学生成绩要按照“姓名:年龄:生日:成绩”,那么这样的数据可以出现多条,例如“SMITH:20:2000-09-21:90.9” 等等,多条记录之间要求使用“|”隔开
那么下面首先要进行问题拆分,因为这个验证包含很多小规则
- 规则一:验证姓名,不设长度限制(一位或多位,用+表示)
package cn.mldn.demo;
public class TextDemo {
public static void main(String[] args) throws Exception {
String num = "SMITH";
String regex = "[a-zA-Z]+";
System.out.println(num.matches(regex));
}
}
- 规则二:验证年龄,年龄是一个数字,长度范围1~3位
package cn.mldn.demo;
public class TextDemo {
public static void main(String[] args) throws Exception {
String num = "19";
String regex = "\\d{1,3}";
System.out.println(num.matches(regex));
}
}
- 规则三:验证生日,生日是数字组合
package cn.mldn.demo;
public class TextDemo {
public static void main(String[] args) throws Exception {
String num = "1999-09-21";
String regex = "\\d{4}-\\d{2}-\\d{2}";
System.out.println(num.matches(regex));
}
}
- 规则四:验证分数,分数有小数,成绩最多三位,小数最多两位
package cn.mldn.demo;
public class TextDemo {
public static void main(String[] args) throws Exception {
String num = "99.21";
String regex = "\\d{1,3}(\\.\\d{1,2})?";
System.out.println(num.matches(regex));
}
}
- 整合验证
package cn.mldn.demo;
public class TextDemo {
public static void main(String[] args) throws Exception {
String num = "SMITH:19:1999-09-21:99.21";
String regex = "[a-zA-Z]+:\\d{1,3}:\\d{4}-\\d{2}-\\d{2}:\\d{1,3}(\\.\\d{1,2})?";
System.out.println(num.matches(regex));
}
}
- 满足多组信息操作
package cn.mldn.demo;
public class TextDemo {
public static void main(String[] args) throws Exception {
String str = "SMITH:19:1999-09-21:99.21|ALLEN:27:1991-11-23:100|TONY:18:2000-03-15:105.8";
String regex = "([a-zA-Z]+:\\d{1,3}:\\d{4}-\\d{2}-\\d{2}:\\d{1,3}(\\.\\d{1,2})?\\|?)+";
System.out.println(str.matches(regex));
}
}
范例:验证ermail地址,email地址的验证规则如下
- 用户名只能够以字母、_、数字、组成;
- 用户名只能够以字母开头
- 用户名的长度要求在6~20位之间
- 域名只能是:com、.cn、net、.com.cn、.net.cn、.edu、.gov;
package cn.mldn.demo;
public class TextDemo {
public static void main(String[] args) throws Exception {
String str = "mldn.hello156@163.com.cn";
String regex = "[a-zA-Z][a-zA-Z0-9_\\.]{5,19}"+"@[a-zA-Z-0-9]+\\."+"(com|cn|net|gov|com\\.cn|net\\.cn)";
System.out.println(str.matches(regex));
}
}