0.前言
为什么要用正则,如果判断一个QQ号是否符合格式要求,你花大量时间手写一堆代码,而正则封装了这些代码,你可以少搬些砖。正则在各种语言中都存在,而且用法基本相同。
1.正则常见的字符串和操作
常见的四种操作
- 匹配
- 切割
- 替换
- 获取
1.1匹配
java API文档中String的matches方法有到正则语法的链接
在其他语言中,\ \ 表示:我想要在正则表达式中插入一个普通的(字面上的)反斜杠,请不要给它任何特殊的意义。
在 Java 中,\ \ 表示:我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义。
所以,在其他的语言中,一个反斜杠\就足以具有转义的作用,而在正则表达式中则需要有两个反斜杠才能被解析为其他语言中的转义作用。也可以简单的理解在正则表达式中,两个 \ 代表其他语言中的一个 \,所以这也就是为什么表示一位数字的正则表达式是 \ \d,而表示一个普通的反斜杠 是 \ \ \ \。
//qq号必须是5-15位,0不可以开头,必须全数字
String qq = "12345";
//[0-9]代表第一个字符必须是0-9,[1-9]{4,14}代表0-9范围的数字必须连续出现4-14次
//所以regex表示5-15位,0不可以开头,必须全数字的一个字符串
String regex = "[0-9][1-9]{4,14}";
//注意:正则表达式中的空格代表匹配空格,[0-9] [1-9]{4,14}代表第二位是空格的qq号
//判断是否匹配正则表达式
boolean flag = qq.matches(regex);
System.out.println(flag); //true
//第一个字符必须是a
String regex0 = "a[0-9][1-9]{4,14}";
//第一个字符必须是abc其中的一个
String regex1 = "[abc][0-9][1-9]{4,14}";
//第一个字符必须不能是abc其中的一个
String regex2 = "[^abc][0-9][1-9]{4,14}";
String qq = "a12345";
System.out.println(qq.matches(regex2));//false
//第一个字符可以是一切东西,空格,+,都可以
String regex0 = ".[0-9][1-9]{4,14}";
//第一个字符必须是0-9,\d等同于[0-9]
String regex1 = "\\d[1-9]{4,14}";
//第一个字符必须不是数字,\D等同于[^0-9]
String regex2 = "\\D[1-9]{4,14}";
//第一个数字必须是空白字符,空白字符不是仅仅是空格。
//\s等同于空白字符:[ \t\n\x0B\f\r],\S:非空白字符
String regex3 = "\\s[1-9]{4,14}";
//\w 单词字符:[a-zA-Z_0-9],\\W非单词字符
String regex4 = "\\w[1-9]{4,14}";
/**
Greedy:贪婪的;Reluctant:勉强的,懒惰的;Possessive :独占的。
Greedy 数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
正则表达式中,默认情况下基本上都是使用Greedy数量词
例如字符串"qwert12345",可以匹配它的正则表达式为".*5".其中"."可以匹配任何字符,"*"表示匹配0次或多次,程序在编译运行时,"qwert12345"字符串本身可以被".*"匹配,但是后边多了个"5"无法匹配,因此回溯一个字符,正好匹配了"5",所以返回true.
Reluctant 数量词
X?? X,一次或一次也没有
X*? X,零次或多次
X+? X,一次或多次
X{n}? X,恰好 n 次
X{n,}? X,至少 n 次
X{n,m}? X,至少 n 次,但是不超过 m 次
Reluctant数量词在匹配时,与Greedy的匹配模式是相反的,它从左到右一个一个进行匹配,而不是匹配字符串再进行回溯
例如字符串"qwert12345",".*?3"也是匹配的,因为从左到右一个一个看只有整个字符串才能匹配,而对于正则表达式".+?"来说,只匹配最左边的字符q,如果正则表达式是".*?"则意味着没有匹配任何字符串.
Possessive 数量词
X?+ X,一次或一次也没有
X*+ X,零次或多次
X++ X,一次或多次
X{n}+ X,恰好 n 次
X{n,}+ X,至少 n 次
X{n,m}+ X,至少 n 次,但是不超过 m 次
Possessive数量词与Greedy数量词类似,也是匹配字符串.唯一的不同时Possessive不回溯,所以对于"qwert12345",".*+3"不匹配.
*/
String regex1 = "a*?[1-9]{4,14}";
String qq = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa12345";
System.out.println(qq.matches(regex1));//true
1.2切割
String str = "张三,李四,王五";
String regex= ",";
String[] strs = str.split(regex);
for(String s : strs) {
System.out.println(s);
}
输出:
张三
李四
王五
高