First Of All
定义:
正则表达式,又称规则表达式,是计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式的文本。
BUT见名难知意
从本菜鸟角度来看,正则表达式是一种一看就会,不看就忘的符号规定。略显繁杂的符号规定与书写规范又确确实实减少了一般对于字符串等格式化代码的书写量。先简单对比一下同一题目下二者的代码量把:
检验身份证是否符合以下规则:
1.长度18
2.不能以0开头
3.前17位必须是数字
4.最后一位可以是大写或小写x
先看看普通方法(符合返回true,不符合返回false):
private static boolean checkPersonID(String personID) {
// 1.长度18
if(personID.length()!=18){
return false;
}
// 2.不能以0开头
boolean flag = personID.startsWith("0");//如果是以"0"开头则返回true
//方法二:可以用char c = personID.charAT(0);将第一索引字符取出,再用c与"0"判断
if(flag){
return false;
}
// 3.前17位是数字
for (int i = 0; i < personID.length()-1; i++)//17位,所以减一
{
char c = personID.charAt(i);
if (!(c>='0'&&c<='9')) {
return false;//如果有一个不在0-9之间,直接return false.
}
}
// 4.最后一位可以是数字,可以是大写X或小写x
char endChar = personID.charAt(personID.length()-1);
if ((endChar<='9'&&endChar>='0')||(endChar=='x')||(endChar=='X')){
return true;
}else {
return false;
}
}
OK,然后康康使用了正则表达式的方法:
String checkPersonID = "[1-9]\\d{16}(\\d|(?i)x)";
System.out.println(“47031120000927501x".matches(checkPersonID));
好,见识到了正则表达式的简便,让我们正式康康正则表达式到底有些神马规则吧:
[abc] 只能是a,b或者c
[^abc] 除了a,b,c之外的任意字符
[a-zA-Z] a到z A到Z,包括(范围)
[a-d[n-p]] a到d,或n到p
[a-z&&[def]] a到z与def的交集(可以是d,e,f)
. 任何字符
\d 一个数字:[0-9]
\s 一个空白符号:[\t\n\x08\f\r]
\S 非空白字符:[^\s]
\w 英文,数字,下划线:[a-zA-Z_0-9]
(?i)x 表示忽略x大小写
| 表示或
X? X,1次或0次
X* X,0次或多次
X+ X,1次或多次
X{n} X,正好n次
X{n,} X,至少n次
X{n,m} X,至少n次但是不超过m次
值得一提的是,正则表达式使用场景一般为对符合要求的数据进行判断然后进行爬取 所以在一般使用时候需要进行导包:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
其中pattern表示正则表达式,matcher表示文本匹配器
来个例题
对于以下文本:
"Java自从95年问世以来,经历了很多版本,目前企业中川的最多的是Java8和Java11, 因为这两个是长期支持版本,下一个长期支持版木是Java17,相信在未来不久了Java17也会逐渐登上历史舞台"
按需求爬取数据:
需求1:爬取版本号为8,11,17的Java文本,但是只要Java不要显示版本号
需求2:爬取版本号为8,11,17的Java文本,正确爬取结果为Java8 Java11 Java17 Java17
需求3:爬取版本号为8,11,17的Java文本
psvm{
String s = "Java自从95年问世以来,经历了很多版本,目前企业中川的最多的是Java8和Java11, 因为这两个是长期支持版本,下一个长期支持版木是Java17,相信在未来不久了Java17也会逐渐登上历史舞台"
//?理解为前面的数据Java
//=表示在Java后面要跟随的数据
//但是在获取时候只获取前半部分
//需求1
String regex1 = "((?i)Java)(?=8|11|17)";
//需求2
String regex2 = "((?i)Java)(8|11|17)";
//OR
String regex3 = "((?i)Java)(?:8|11|17)";
//需求3
String regex4 = "((?i)Java)(?!8|11|17)";
Pattern p = Pattern.compile(regex1);//按需求取regtex1-4
Matcher m = p.matcher(s);
while(m.find())//循环爬取所有数据
{
sout(m.group());
}
}
然后还有以下正则表达式在字符串方法中的使用:
| 方法名 | 说明 |
|---|---|
| public String[] matches(String regex) | 判断字符串是否满足正则表达式的规则 |
| public String replaceAll(String regex, String newStr) | 按照正则表达式的规则进行替换 |
| public String[] split(String regex) | 按照正则表达式的规则切割字符串 |
其中,有一个左括号代表一组
捕获分组中:
\\组号(正则内部)
和
$组号(正则外部)
表示把第几组的内容拿出来再用一次
非捕获分组中:
tips:
split表示切割
OK~~~完结撒花~~~