正则表达式
常用正则规范
序号 | 规范 | 描述 | 序号 | 规范 | 描述 |
1 | \\ | 表示反斜线(\)字符 | 9 | \w | 表示字母,数字,下划线 |
2 | \t | 制表符 | 10 | \W | 表示非字母,数字,下划线 |
3 | \n | 换行 | 11 | \s | 表示所有的空白字符(换行,空格等) |
4 | [abc] | 表示字符a,b或c | 12 | \S | 表示所有非空白字符 |
5 | [^abc] | 表示除了a,b,c之外的任意字符 | 13 | ^ | 行开头 |
6 | [a-zA-Z0-9] | 表示由字母.数字组成 | 14 | $ | 行的结尾 |
7 | \d | 表示数字 | 15 | . | 匹配除换行符之外的任意字符 |
8 | \D | 表示非数字 |
数量表示
序号 | 规范 | 描述 | 序号 | 规范 | 描述 |
1 | X | 必须出现一次 | 5 | X{n} | 必须出现n次 |
2 | X? | 出现0次或1次 | 6 | X{n,} | 必须出现n次以上 |
3 | X* | 可以出现0次,1次或者多次 | 7 | X{n,m} | 必须出现n到m次 |
4 | X+ | 可以出现1次或者多次 |
1,认识正则表达式
正则表达式可以方便的对数据进行匹配,还可以执行更加复杂的字符串验证,拆分,替换功能,它用于操作字符串数据
正则表达式操作类是通过Pattern和Matcher两个类来完成的
2,Pattern类和Matcher类
这两个类都是定义在java.util.regex包中的,Pattern类的主要作用是进行正则规范的编写,而Matcher类主要是执行规范,验证一个字符串是否符合其规范
在Pattern类中如果要取得Pattern类实例的话,则必须使用compile()方法.
package cn.regex; import java.util.regex.Pattern; public class RegexDemo { public static void main(String[] args) { String str = "1234567890"; if(Pattern.compile("[0-9]+").matcher(str).matches()){ System.out.println("是由数字组成"); }else{ System.out.println("不是数字组成"); } } }
如果要验证一个字符串是否符合规范的话,则可以使用Matcher类,该类中常用的方法
package cn.regex; import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexDemo02 { public static void main(String[] args) { dateRegex(); splitString(); } public static void splitString() { String str = "AAA1111BBB33333CCC2222"; String regex = "\\d+"; Pattern p = Pattern.compile(regex); String[] s = p.split(str); for(String s1 : s){ System.out.print(s1); } } private static void dateRegex() { String str = "1990-11-11"; String regex = "\\d{4}-\\d{2}-\\d{2}"; Pattern p = Pattern.compile(regex); Matcher m = p.matcher(str); if(m.matches()) System.out.println("日期格式合法!"); else System.out.println("日期格式不合法"); } }
3,String类对正则表达式的支持
在String类中,有三个方法支持正则操作,以后一般使用的是String类中的方法,这样会比较方便
package cn.regex; import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexDemo02 { public static void main(String[] args) { dateRegex(); splitString(); } public static void splitString() { String str = "AAA1111BBB33333CCC2222"; String regex = "\\d+"; Pattern p = Pattern.compile(regex); String[] s = p.split(str); for(String s1 : s){ System.out.print(s1); } } private static void dateRegex() { String str = "1990-11-11"; String regex = "\\d{4}-\\d{2}-\\d{2}"; Pattern p = Pattern.compile(regex); Matcher m = p.matcher(str); if(m.matches()) System.out.println("日期格式合法!"); else System.out.println("日期格式不合法"); } }
4,正则表达式的作用
(1)匹配 使用String中的mathches方法
public static void demo_1() { String tel = "15061539693"; String regex = "1[358][0-9]{9}"; // \\d和[0-9]效果一样 boolean b = tel.matches(regex); System.out.println(b); }
(2)切割 使用的是String中的split方法
public static void demo2() { String str = "zhangsan lisi wangwu"; String[] names = str.split(" +");//空格至少出现一次 和{1,}一样 for (String string : names) { System.out.println(string); } String str2 = "zhangsanaaaaalisibbbbbwangwu"; String[] name = str2.split("(.)\\1+"); for (String string2 : name) { System.out.println("2:"+string2); } }
(.)表示一个捕获组,1表示使用到该组,+表示可以出现一次或者是多次
(3)替换 String中replaceAll方法
public static void demo3() { String str1 = "zhangsanAAAAlisiBBBBwangwu"; String s = str1.replaceAll("(.)\\1+", "$1"); System.out.println(s); String str2 = "15061539693"; String s2 = str2.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2"); System.out.println(s2); }
(4)获取
Pattern p = Pattern.compile("a*b"); 将正则的规则进行对象的封装
Matcher m = p.matcher("aaaaab"); 通过正则对象的matcher方法字符串相互关联,获取要对字符串进行操作的Matcher
boolean b = m.matches(); 通过Matcher匹配器对象的方法对字符串进行操作
public static void demo_4() { String str = "aa ada awa aa aaaaaa aqa"; String regex = "\\b[a-z]{3}\\b"; // \\b表示单词边界 Pattern p = Pattern.compile(regex); Matcher m = p.matcher(str); while(m.find()){ System.out.println(m.group()); } }