黑马程序员-----正则表达式

时间:2023-02-19 09:42:44

——- android培训java培训、期待与您交流! ———-

一、 正则表达式的概述:

1、 正则表达式用于操作字符串数据的,通过一些特定的符号来表现的。简化了代码,提高了效率,但同时也降低了阅读性。
2、 常见的特殊符号;
1) 特殊字符:

\\:反斜线
\r:回车
\n:换行

2) 字符类:

 [abc]a,b或者c的任意一个。
[^abc]:除了a,b,c以外的字符。
[a-zA-Z]:包括了26个英文字母。
[0-9]:包括了0-9这个10个数字字符。

3) 预定义字符类:

 .任意字符
\d 数字[0-9]
\D 非数字[^0-9]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]

4) 边界匹配器:

 ^ 行的开头 
$ 行的结尾
\b 单词边界

5) Greedy 数量词:

 x? 0次或1
x* 0次或多次
x+ 1次或多次
x{n} 恰好n次
x{n,} 至少n次
x{m,n} 至少m次,但不能超过n次

3、示例演示:写一个正则表达式,可以匹配尾号5连的手机号。规则: 第1位是1,第二位可以是数字3458其中之一,后面4位任意数字,最后5位为任意相同的数字。

package com.itheima;
/**
*需求:写一个正则表达式,可以匹配尾号5连的手机号。规则: 第1位是1,第二位可以是数字3458其中之一,后面4位任意数字,最后5位为任意相同的数字。
* 例如:18601088888、13912366666
*/

public class Test{

public static void main(String[] args)
{
telCheck();
}
public static void telCheck()
{
String tel="18601088888";
String regex="1[3458]\\d{4}(\\d)\\1{4}"; //定义正则表达式的规则
boolean b=tel.matches(regex); //将字符串tel与regex相匹配
System.out.println(tel+"输入格式为:"+b);

}

}

二、 正则表达式的常见功能:

1、 匹配:String matches方法。用于匹配整个字符串,只要有益处不符合规则,就匹配结束,返回false.

package com.zhengzedemo;
/**需求:演示正则表达式的匹配功能
* @param args
*/

public class PiPei {

public static void main(String[] args) {
method();

}
public static void method()
{
String str="shan4";
String regex="[a-z]{4}\\d?";
boolean b=str.matches(regex);
System.out.println(b);
}

}

2、 切割:String split方法
1)切割符为多个空格

package com.zhengzedemo;
/**需求:演示正则表达式的切割功能
* @param args
*/

public class QiGe {

public static void main(String[] args) {
split_1();

}
public static void split_1()
{
String str="shanwenling qige xiaomei lisisi";//字符串里面的空格不确定个数
String reg=" +";//+代表一个或多个,在这里表示空格是一个或多个
String[] arr=str.split(reg);
for(String s:arr)
{
System.out.println(s);
}
}

}

2)切割符为.

public static void split_2()
{
String str="shanwenling.qige.xiaomei.lisisi";
String reg="\\.";//因为.是一个任意字符,\.表示一个转义字符,所以要想用.来切割只能是\\.
String[] names=str.split(reg);
for(String name:names)
{
System.out.println(name);
}
}

3)为了可以让规则的结构被重用,可以将规则封装成一个组。用()完成。组的出现都有编号,从1开始,想要使用已有的组可以通过\n(n就是组的编号)的形式来获取。
例如;String reg=”((A)(B))”;
第一组:((A)(B))
第二组:(A)
第三组:(B)
第0组是整个字符串
总结:规则中有几对小括号,就有几组

3、 替换:String replaceAll方法

package com.zhengzedemo;
/**需求:1、将字符串中的叠词替换成#
* 2、将字符串中的叠词替换成单个字符
* @param args
*/

public class TiHuan {

public static void main(String[] args) {
String str="aggjbkkcwetrrpqq";
String reg="(.)\\1";//这个规则用组的形式表示一个叠词
method_1(str,reg,"");
method_2(str,reg,"");


}
//将字符串中的叠词替换成#
public static void method_1(String str,String reg,String newStr)
{
newStr=str.replaceAll( reg, "#");
System.out.println(newStr);
}
//将字符串中的叠词替换成单个字符
public static void method_2(String str,String reg,String newStr)
{
newStr=str.replaceAll( reg, "$1");//$1表示获取前面规则中组的内容
System.out.println(newStr);
}

}

4、 获取:将字符串中符合规则的子串取出
操作步骤:

 1)将正则表达式封装成对象
2)让正则对象和要操作的字符串相关联
3)关联后,获取正则匹配引擎
4)通过引擎对符合规则的子串进行操作,比如取出。

示例演示:

package com.zhengzedemo;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**需求:获取字符串中三个字母组成的单词
* @param args
*/

public class HuoQu {

public static void main(String[] args) {

method();

}
public static void method()
{
String str="xiang zhe hei ma qian jin";
String reg="\\b[a-z]{3}\\b";
//将正则表达式封装成对象
Pattern pt=Pattern.compile(reg);
//让正则对象和要操作的字符串相关联
Matcher m=pt.matcher(str);
//关联后,获取正则匹配引擎
while(m.find())//将规则作用在字符串上,并进行符合规则的查找
{System.out.println(m.group());}//获取匹配后的结果
}

}

三、 网页爬虫(类似于蜘蛛)

示例演示:

package com.zhengzedemo;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**演示网页爬虫的功能:
* 1、获取指定文档中的邮箱地址
* 2、获取网页中的邮箱地址
* @param args
*/

public class PaChong {

public static void main(String[] args) throws IOException {
method_1();

}
//获取指定文档中的邮箱地址
public static void method_1() throws IOException
{
BufferedReader bufr=new BufferedReader(new FileReader("D:\\a.txt"));//读取指定的文档
String line=null;
String mailReg="\\w+@\\w+(\\.\\w+)+";//定义正则规则
Pattern p=Pattern.compile(mailReg);//将正则表达式封装成对象

while((line=bufr.readLine())!=null) //读取文档中的数据
{
Matcher m=p.matcher(line);//让正则对象和要操作的字符串相匹配
while(m.find()) //将规则作用在字符串上,并进行符合规则的查找
{
System.out.println(m.group());//获取匹配后的结果
}

}

}
//获取网页中的邮箱地址
public static void method_2() throws IOException
{
URL url=new URL("http://172.18.254.7:8080/myweb/mail.html");
URLConnection conn=url.openConnection();
BufferedReader bufrIn=new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line=null;
String mailReg="\\w+@\\w+(\\.\\w+)+";//定义正则规则
Pattern p=Pattern.compile(mailReg);//将正则表达式封装成对象

while((line=bufrIn.readLine())!=null) //读取文档中的数据
{
Matcher m=p.matcher(line);//让正则对象和要操作的字符串相匹配
while(m.find()) //将规则作用在字符串上,并进行符合规则的查找
{
System.out.println(m.group());//获取匹配后的结果
}

}

}


}

——- android培训java培训、期待与您交流! ———-