正则表达式:主要的作用可以非常方便完成一些复杂的严整功能等基本实现。
通过一个小的程序来认识一下正则表达式。
首先是一个没有用正则表达式的判断字符串是否由字符串组成的程序
package org.study.RebortChao;
public class RegexDemo01{
public static void main(String[] args) {
String str="12345678";//此字符串现在是由数字组成
char c[] = str.toCharArray(); //将字符串变为字符数组
boolean flag = true;
for(int x = 0;x<c.length; x++){ //进行循环验证
if (!(c[x] >= '0' && c[x] <= '9')){
//不是0~9之间的数条件成立
flag = false;
break; //退出循环
}
}
if(flag){
System.out.println("字符串完全由数字组成。");
}else{
System.out.println("字符串数字和其他组成。");
}
}
}
接下来再看用正则表达式的程序
package org.study.RebortChao;
public class RegexDemo02{
public static void main(String[] args) {
String str = "12345as678";// 此字符串现在是由数字组成
if (str.matches("\\d+")) {
System.out.println("字符串由数字组成!");
}else{
System.out.println("字符串由非数字组成!");
}
}
}
操作明显比第一种实现更加容易,而且代码较少,那么在操作中使用的“\d+”实际上就属于正则表达式。
一丶正则表达式(regular expression)
java.util.regex包中的【Pattern类】,里面列出全部的正则表达式内容。
在Pattern类中需要指定要操作的正则表达式规范,在Matcher类进行验证。
1、常用的【字符匹配】正则表达式。
(1)、[abc]:表示取值可能是a,可能是b,可能是c。
(2)、[^abc]:表示取值不是a、b、c的任意一个内容。
(3)、[a-zA-Z]:表示全部的字母,大写和小写。
(4)、[a-z]表示小写字母。
(5)、[A-Z]表示大写字母。
2、简短的正则表达式。
(1)、\d:表示由数字组成。
(2)、\D:表示由非数字组成。
(3)、\s:表示有空格组成,空格包含了"\n"、"\t"之类的。
(4)、\S:表示由非空格组成。
(5)、\w:表示由字母、数字、下划线组成。
(6)、\W:表示由非字母、数字、下划线组成。
3、列出【出现的次数】的正则表达式。
(1)、X?:表示正则表达式出现0次或1次。
(2)、X*:表示正则表达式出现0次、1次或多次。
(3)、X+:表示正则表达式出现1次或多次。
(4)、X{n}:表示出现的长度正好是n次。
(5)、X{n,}:表示出现的长度大于n次。
(6)、X{n,m}:表示出现的长度正要好是n到m次。
4、【关系运算】的正则表达式。
(1)、X|Y:要么是X的正则,要么是Y的正则。
(2)、(X):表示一组规范。
二丶java.util.regex.Pattern类
Pattern类是一个重要的类在正则操作中,所有的正则规范需要在 Pattern 类中进行指定。
"\d+",表示数字可能出现1次或多次。
package org.study.RebortChao;
import java.util.regex.Pattern;
public class RegexPatternDemo{
public static void main(String[] args) {
Pattern pat = Pattern.compile("\\d+");
//实例化Pattern类对象
String str = "a1b22C333D4444E55555";
String s[] = pat.split(str); //进行字符串的拆分
for(int x=0; x<s.length; x++) {
System.out.print(s[x]+"、");
}
}
}
Pattern类主要是定义正则规范,并进行字符串拆分操作的。
三丶java.util.regex.Matcher类
之后使用Pattern类中的matcher()方法,设置要验证的字符串进行最终的验证。
package org.study.RebortChao;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexMatcherDemo{
public static void main(String[] args) {
String str = "111-22-333"; //定义字符串
String pat = "\\d{3}-\\d{2}-\\d{3}";//定义正则
Pattern p = Pattern.compile(pat);
Matcher m = p.matcher(str);
if (m.matches()){ //进行正则的匹配,匹配不为空进入if条件句
System.out.println("验证成功!");
}else{
System.out.println("验证失败!");
}
}
}
使用Matcher类还可以完成【替换】的功能。
package org.study.RebortChao;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexMatcherDemo01{
public static void main(String[] args){
String str = "a1b22C333D4444E55555";
//定义字符串,将数字全部替换成“☆”
String pat = "\\d+";// 定义正则
Pattern p = Pattern.compile(pat);
Matcher m = p.matcher(str);
System.out.println(m.replaceAll("☆"));//替换
}
}
四丶String类对正则的支持。
public boolean matches(String regex) 指定正则规则,并进行验证。
public String replaceAll(String regex,String replacement) 字符串替换,支持正则。
public String replaceFirst(String regex,Stringreplacement) 替换第一个,支持正则。
public String[] split(String regex) 字符串拆分,支持正则。
- 开发中如果要想使用正则,基本上都是直接应用String类,很少去直接使用Pattern类或Matcher类,因为String的功能已经足够强大了。
给定一个 IP 地址,要求“.”拆分
public class StirngSplit{
public static void main(String[] args){
String ip = "192.168.1.3";//定义IP地址
String str[] = ip.split("\\.");//只要拆不开,就加入转义字符
for (int x=0; x<str.length; x++){
System.out.print(str[x] + "、");
}
}
}
要求验证一个email地址是否合法。
正则:"\\w+@\\w+.\\w+"。
public class StirngMatches {
public static void main(String[] args) {
String ip = "aa@aa.com";// 定义email地址
System.out.println(ip.matches("\\w+@\\w+.\\w+"));
}
}
public class StirngMatches{
public static void main(String[] args) {
String ip = "aa@aa.com.cn";// 定义email地址
System.out.println(ip
.matches("\\w+@\\w+.(com|com.cn|cn|net.cn|org|edu|gov)"));
}
}