正则表达式
以检验扣扣号是否合法为例引入正则表达式
要求:校验QQ号,要求:必须是5~15位数字,0不能开头。
1.没有正则表达式
public class Demo1 { public static void main(String[] args) { String qq="45646465"; checkQQ(qq); } public static void checkQQ(String qq) { int len = qq.length(); if(len>=5 && len <=15) { if(!qq.startsWith("0")) { try { long l = Long.parseLong(qq); System.out.println("qq:"+l); } catch (NumberFormatException e) { System.out.println("出现非法字符"); } } else System.out.println("不可以0开头"); } else System.out.println("QQ号长度错误"); } }
2.使用正则表达式
public class Demo1 { public static void main(String[] args) { String qq="45646465"; System.out.println(qq.matches("[1-9]\\d{4,14}")?"true":"false"); }
什么是正则表达式?
正则表达式:其实一种规则,有自己特殊的应用,其作用就是针对于字符串进行操作。
正则:就是用于操作字符串的规则,其中这些规则使用了一些字符表示。
正则表达式的符号(一部分)
预定义字符类
. |
任何字符(与行结束符可能匹配也可能不匹配) |
|
\d |
数字:[0-9] |
|
\D |
非数字: [^0-9] |
|
\s |
空白字符:[ \t\n\x0B\f\r] |
|
\S |
非空白字符:[^\s] |
|
\w |
单词字符:[a-zA-Z_0-9] |
|
\W |
非单词字符:[^\w] |
|
System.out.println("a".matches(".")); System.out.println("1".matches("\\d")); System.out.println("%".matches("\\D")); System.out.println("\r".matches("\\s")); System.out.println("^".matches("\\S")); System.out.println("a".matches("\\w")); |
Greedy 数量词
X? |
X,一次或一次也没有 |
X* |
X,零次或多次 |
X+ |
X,一次或多次 |
X{n} |
X,恰好n次 |
X{n,} |
X,至少n次 |
X{n,m} |
X,至少n次,但是不超过m次 |
System.out.println( "a".matches(".") ); System.out.println( "a".matches("a") ); System.out.println("a".matches("a?") ); System.out.println( "aaa".matches("a*") ); System.out.println( "".matches("a+") ); System.out.println( "aaaaa".matches("a{5}") ); System.out.println( "aaaaaaaaa".matches("a{5,8}") ); System.out.println( "aaa".matches("a{5,}") ); System.out.println( "aaaaab".matches("a{5,}") ); |
范围表示
[abc] |
a、b 或 c(简单类) |
[^abc] |
任何字符,除了 a、b 或 c(否定) |
[a-zA-Z] |
a 到 z 或 A 到 Z,两头的字母包括在内(范围) |
[a-d[m-p]] |
a 到 d 或 m 到 p:[a-dm-p](并集) |
[a-z&&[def]] |
d、e 或 f(交集) |
[a-z&&[^bc]] |
a 到 z,除了 b 和 c:[ad-z](减去) |
[a-z&&[^m-p]] |
a 到 z,而非 m 到 p:[a-lq-z](减去) |
|
|
System.out.println( "a".matches("[a]") ); System.out.println( "aa".matches("[a]+") ); System.out.println( "abc".matches("[abc]{3,}") ); System.out.println( "abc".matches("[abc]+") ); System.out.println( "dshfshfu1".matches("[^abc]+") ); System.out.println( "abcdsaA".matches("[a-z]{5,}") ); System.out.println( "abcdsaA12".matches("[a-zA-Z]{5,}") ); System.out.println( "abcdsaA12".matches("[a-zA-Z0-9]{5,}") ); System.out.println( "abdxyz".matches("[a-c[x-z]]+")); System.out.println( "bcbcbc".matches("[a-z&&[b-c]]{5,}")); System.out.println( "tretrt".matches("[a-z&&[^b-c]]{5,}"));
|
正则表达式经常实现的功能
匹配matches
例题:是否为一个合法的手机号码
//匹配是否为一个合法的手机号码 public class Demo5 { public static void main(String[] args) { String telephoneNuumber = "18809405364"; System.out.println(checkTel(telephoneNuumber)?"合法":"不合法"); } public static boolean checkTel(String a) { String b = a; String c = "1[34578]\\d{9}";//[0-9]数字在0-9,\\d只能是数字,{11}恰好11位数字 boolean f = b.matches(c); return f; } }
切割功能split
例题:根据空格对一段字符串进行切割
import java.lang.reflect.Array; import java.util.Arrays; //匹配是否为一个合法的手机号码 public class Demo4 { public static void main(String[] args) { String str = "aa bb cc "; System.out.println(splitDemo(str)); } public static String splitDemo(String str) { String str1 = str; String[] arr = str1.split(" +"); return Arrays.toString(arr); } }
例题:根据重叠词进行切割
分组概念((A)(B(C)))
第1组 ((A)(B(C)))
第2组 (A)
第3组 (B(C))
第4组 (C)
import java.util.Arrays; public class Demo3 { public static void main(String[] args) { String str = "sdqqfgkkkhjppppkl"; System.out.println(splitDemo2(str)); } public static String splitDemo2(String str) { String str1 = str; String[] arr = str1.split("(.)\\1+"); return Arrays.toString(arr); } }
替换功能replaceAll
例题:把手机号替换成“*”号
public class Demo2 { public static void main(String[] args) { replaces(); } public static void replaces() { String str = "联系方式:13327351612,联系方式:13327351612,联系方式:13327351612,联系方式:13327351612,联系方式:13327351612"; String reg = "1[34578]\\d{9}"; str = str.replaceAll(reg, "********"); System.out.println(str); } }
获取
获取需要使用到正则的两个对象:使用的是用正则对象Pattern 和匹配器Matcher。
用法:
范例:
Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();
步骤:
1,先将正则表达式编译成正则对象。使用的是Pattern类一个静态的方法。compile(regex);
2,让正则对象和要操作的字符串相关联,通过matcher方法完成,并返回匹配器对象。
3,通过匹配器对象的方法将正则模式作用到字符串上对字符串进行针对性的功能操作
匹配器要使用到的方法:
find();通知匹配器去匹配字符串。查到就返回true,反之返回false
group();获取符合规则的字符串
注意:使用group前一定要用find方法去匹配器查找符合规则的字符串,否则报错
例题:获取由3个字母组成的单词。
import java.util.regex.Matcher; import java.util.regex.Pattern; public class Demo7 { public static void main(String[] args) { getDemo(); } public static void getDemo() { String str = "da jia zhu yi le,ming tian bu fang jia,xie xie!"; String reg = "\\b[a-z]{3}\\b";//"\b":单词边界匹配器,只是代表了单词的开始或者是接受部分,不匹配任何字符 Pattern p = Pattern.compile(reg); Matcher m = p.matcher(str); while(m.find()) { System.out.println(m.group()); } } }