正则表达式介绍
- 是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串。其实就是一种规则。有自己特殊的应用。
- 作用:比如注册邮箱,邮箱有用户名和密码
- 位于:java.util.regex
正则表达式的利用
- String类中有一 matches()方法 用于告知此字符串是否匹配给定的正则表达式 如果匹配返回 true 反之 返回 false
String regex = "[1-9]\\d{4,14}";//先不用理解 等下讲解
"1234567".matches(regex);//true
正则表达式的字符 限制类
- 中括号的单个字符**[ ]**
- [abc] a、b 或 c(简单类)
- [^abc] 任何字符,除了 a、b 或 c(否定)
- [a-zA-Z] a到 z 或 A到 Z [包含头包含尾]
- [a-d[m-p]] a到d或者m到p(不写就是**||**取并集)
- [a-z&&[def]] 和它做交集 得到d、e 或 f 在a-z中而且在def中
- [a-z&&[^bc]] a- z 除了 b和c
- [a-z&&[^m-p]] 在a-z中,除了m-p
正则表达式 的预定义字符类
- . 任意字符
- … 两个任意字符
*都是指单个字符而且都是反斜杠* - \d 0到9的字符都包括任意 但是要注意的是**\是转义字符**[0-9]
- \D 非数字[^0-9]
- \s 空白字符:[ \t\n\x0B\f\r]
- \S 非空白字符
- \w 单词字符[a-zA-Z_0-9]这里数字也是可以的(数字和字母(大小写))
- \W 非单词字符
正则表达式的数量词Greedy
- X? X 有一次或一次也没有
String regex = "[abc]?";
System.out.println("a".matches(regex));//true 只出现了1次(正确)
System.out.println("ab".matches(regex));//false 出现了2次
System.out.println("abc".matches(regex));//false 出现了三次
System.out.println("abca".matches(regex));//false 出现了四次
System.out.println("abcabc".matches(regex));//false 出现了6次
System.out.println("".matches(regex));//true 一次也没有(正确)
System.out.println("f2".matches(regex));//false一次也没有但出现了其他字符(错误)
System.out.println("af".matches(regex));//false 出现了1一次但出现了其他字符
//总结:出现1次或没有出现是指abc三个任意一出现,而不是都出现,没有出现是"",而不是出现
//了其他字符
- X* X有零次或多次
String regex = "[abc]*";
System.out.println("a".matches(regex));//true 只出现了1次(1次也是多次)
System.out.println("ab".matches(regex));//true 出现了多次
System.out.println("abc".matches(regex));//true 出现多次
System.out.println("abca".matches(regex));//true 出现了四次 (多次)
System.out.println("abcabc".matches(regex));//true 出现了6次(多次)
System.out.println("".matches(regex));//true 一次也没有出现
System.out.println("f2".matches(regex));//false 一次也没有但出现了其他字符(错误)
System.out.println("af".matches(regex));//false 出现了但出现了其他字符
//总结:出现0次或多次是指abc三个任意一出现,或者 "" 都是对,但是只要是出现了
//其他字符就是错误
- X+ X有一次或多次
String regex = "[abc]+";
System.out.println("a".matches(regex));//true 只出现了1次(1次也是多次)
System.out.println("ab".matches(regex));//true 出现了多次
System.out.println("abc".matches(regex));//true 出现多次
System.out.println("abca".matches(regex));//true 出现了四次 (多次)
System.out.println("abcabc".matches(regex));//true 出现了6次(多次)
System.out.println("".matches(regex));//false 一次也没有出现
System.out.println("f2".matches(regex));//false 一次也没有但出现了其他字符(错误)
System.out.println("af".matches(regex));//false 出现了但出现了其他字符
//总结:出现1次或多次是指abc三个任意一出现就是对,但是只要是出现了
//其他字符或者出现只有""(空)就是错误
- X{n} X恰好有n次
String regex = "[abc]{3}";
System.out.println("a".matches(regex));//false 只出现了1次(1次也是多次)
System.out.println("ab".matches(regex));//false 出现了多次
System.out.println("abc".matches(regex));//true 出现多次
System.out.println("abca".matches(regex));//false 出现了四次 (多次)
System.out.println("abcabc".matches(regex));//false 出现了6次(多次)
System.out.println("".matches(regex));//false 一次也没有出现
System.out.println("f2".matches(regex));//false一次也没有但出现了其他字符(错误)
System.out.println("af".matches(regex));//false 出现了但出现了其他字符
//总结:恰好有n次出现是指abc三个任意一出现总数为3次就是对,但是只要是出现了
//其他字符也是错误。换种说法:只要出现其他字符肯定错,出现只有""也错,就算只出现abc
//也要保证只有3次
- X{n,} X至少有n次
//和上面类似
- X{n,m} X 至少n次,但不超过m次
//和上面类似
正则表达式的分割功能
- 使用String类中的函数split()方法
String str = "i love java , i love China .";
String [] arr = str.split(" ");
//返回的是arr[0] == i;arr[1] == love 以此类推
//注意我们不能用**.**来分割,.代表的是任意字符,切出来数组将不会存在
正则表达式的替换功能
- 使用String中的replaceAll(String regex,String replacement)
regex 正则表达式规定的内容,替换为replacement
// public String replaceAll(String regex,String replacement)
String str = "i love java , i love China .";
String regex = "\\s";
String str2 = str.replaceAll(regex,"*");
System.out.println(str2);//i*love*java*,*i*love*China*.
正则表达式的分组功能
捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B©)) 中,存在四个这样的组:
1 ((A)(B©))
2 (A
3 (B©)
4 ©
组零始终代表整个表达式。
String s = "我我....我...我.要...要要...要学....学学..学.习习习..习";
String s1 = s.replaceAll("\\.+","");//+代表1次到多次
//我我我我要要要要学学学学习习习习
String s2 = s1.replaceAll("(.)\\1+","$1");//$1 代表第一组中的内容,
//我要学习
瞥见Pattern和Matcher
// 典型的调用顺序是
Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();
//其实和 "aaaaab".matches("a*b");等价
//需求:从一个字符串中把手机号码获取出来
String s = "fahfjf1576922335,fhafnihao18733221548dfaf";
String regex = "1[3578]\\d{9}";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(s);
while(m.find())
System.out.println(m.group());
public boolean find() 尝试查找与该模式匹配的输入序列的下一个子序列
后记
正则表达式 功能十分强大也是难以掌握,我这里知识浅尝,对Pattern和Matcher也没有深入刨析(能力有限),有机会和时间的话,我再深入刨析后,再分享给大家。。。