第2章 正则表达式
1、概述
⑴、正则表达式:是一种专门用来操作字符串的规则,通过一些符号来表示某些程序代码,简化对字符串的复杂操作,但可读性较差。
⑵、由来:对字符串的操作,如果用代码会显得臃肿,而利用正则就能将其简化,
publicclass RegexFrom {
/**
* 需求:校验qq号码
* 长度为5-15位,只能是数字,0不能开头。
*/
publicstaticvoid main(String[] args) {
String qq = "45446554l";
CheckQQ(qq);
//上面的方法太麻烦,于是出现了正则表达式
String regex = "[1-9]{4,14}";
boolean b = qq.matches(regex);
System.out.println(qq+"::"+b);
}
privatestaticvoid CheckQQ(String qq) {
int len = qq.length();
if(len<15&&len>5){
if(!qq.startsWith("0")){
try {
long l = Long.parseLong(qq);
}catch(NumberFormatException e) {
System.out.println("含有非法字符");
}
}else{
System.out.println("不能以0开头");
}
}
else{
System.out.println("长度错误");
}
}
}
2、常见的符号
⑴、Greedy 数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
⑵、边界匹配器
^ 行的开头
$ 行的结尾
\b 单词边界
⑶、字符类
[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](减去)
⑷、预定义字符类
. 任何字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w
\W 非单词字符:[^\w]
3、常见操作
⑴、匹配:String类中的matches方法 matches(regex)
publicstaticvoidmatchFunction() {
Stringtel = "134989879789";//任意一个号码
Stringreg = "1[358]\\d{9}";//定义规则
boolean b = tel.matches(reg);
System.out.println(b);
⑵、获取的步骤
①、将正则规则封装成对象
Pattern p =Pattern.compile("a*b");
②、通过正则对象的Matcher方法与字符串相关联,获取要对字符串操作的匹配器对象Matcher
Matcherm = p.matcher("aaaaab");
③、通过Matcher匹配器对象的方法对字符串进行操作
boolean b= m.matches();
publicstaticvoid function() {
Stringstr = "dajia hao, ming tian bu fang jia";
Stringregex = "\\b[a-z]{3}\\b";//拿三个字符
Patternp = Pattern.compile(regex);
Matcherm = p.matcher(str);
while(m.find()){
System.out.println(m.group());
}
}
⑶、切割:String中的split() spilt(regex)实现复杂切割(连词、叠词)
publicstaticvoidsplitFunction() {
Stringstr = "zhangsan....lisi wangwu";
//String[] names=str.split("\\.+");//.是一个预定义字符类,只有通过两次转义
//想要复用,用()将其封装,然后利用\\加一个数字来表示组标号
String[]names =str.split("(.)\\1+");
//组:可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组:
//1 ((A)(B(C)))
//2 \A
//3 (B(C))
//4 (C)
//组零始终代表整个表达式。
for (String name : names) {
System.out.println(name);
}
}
⑷、替换:replaceAll(regex,str);
publicstaticvoidreplaceAllFunction(){
Stringstr = "15800001111";
//$:获取组,如$1获取的是(\\d{3})
str= str.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
System.out.println(str);
}
4、网页爬虫:通过网络以及IO读取网页源文件,并通过规则获取网页中符合规则的数据。
privatestatic List<String> getMailsByWeb() throws IOException {
//1.1、这是一个爬本地文件的程序,首先读取源文件
// BufferedReader bufr = newBufferedReader(new FileReader(""));
//1.2、这是一个爬网页的程序,首先读取源文件
URLurl = new URL("http://19901111.blog.51cto.com/6838239/1246992");
BufferedReaderbufIn = newBufferedReader(new InputStreamReader(url.openStream()));
//2、对读取的数据进行规则的匹配。从中获取符合规则的数据
Stringmail_regex = "\\w+@\\w+\\.\\w+";
//3、将符合规则的数据存储到集合中
List<String>list = newArrayList<String>();
Pattern p = Pattern.compile(mail_regex);
String line = null;
while((line = bufIn.readLine())!=null){
Matcherm = p.matcher(line);
while(m.find()){
list.add(m.group());
}
}
return list;
}
}