一、简述
- 概念:符合一定规则的表达式,用于操作字符串。
- 特点:将对字符串操作的代码用一些符号来表示。只要使用了指定符号,就可以调用底层的代码对字符串进行操作。简化了代码的书写。
- 好处:正则的出现,对字符串的复杂操作变得更为简单。
- 弊端:符号的出现虽然简化了书写,但是却降低了阅读性。
- 组:
用小括号标示,每定义一个小括号,就是一个组,而且有自动编号,从1开始。
只要使用组,对应的数字就是使用该组的内容。别忘了,数组要加\\。
(aaa(wwww(ccc))(eee))技巧,从左括号开始数即可。有几个左括号就是几组。
对于组中所匹配的字符,可以用$n来获取。$在正则中表示行的结尾,所以出现在正则中不能用来表示组,一般用于替换中。
- 匹配:其实用的就是String类中的matches方法。
String reg = "[1-9][0-9]{4,14}";
boolean b = qq.matches(reg);//将正则和字符串关联对字符串进行匹配。 - 切割:其实用的就是String类中的split方法。
- 替换:其实用的就是String类中的replaceAll();
- 获取:
- 先要将正则表达式编译成正则对象。使用的是Pattern中静态方法 compile(regex);
- 通过Pattern对象获取Matcher对象。
- Pattern用于描述正则表达式,可以对正则表达式进行解析。
- 而将规则操作字符串,需要从新封装到匹配器对象Matcher中。然后使用Matcher对象的方法来操作字符串。
- 如何获取匹配器对象:通过Pattern对象中的matcher方法。该方法可以正则规则和字符串想关联。并返回匹配器对象。
- 使用Matcher对象中的方法即可对字符串进行各种正则操作。
- 四种功能的选择(思路方式):
- 如果只想知道该字符是否对是错,使用匹配。
- 想要将已有的字符串变成另一个字符串,替换。
- 想要按照自定的方式将字符串变成多个字符串。切割。获取规则以外的子串。
- 想要拿到符合需求的字符串子串,获取。获取符合规则的子串。
练习:
import java.net.*;
import java.util.regex.*;
import java.io.*;
class RegexTest
{
public static void main(String[] args)
{
replace();
checkMail();
iPSort();
getWebMail();
getFileMail();
}
/*
练习:
需求:将下列字符串转成:我要学编程
"我我...我..我要...要...要要....学学....学学学......编编编...程...程程...."
思路:
将已有字符串变成另一个字符串。使用替换功能。
1、可以先将 . 去掉。
2、再将多个重复的内容变成单个内容。
*/
public static void replace()
{
String s="我我...我..我要...要...要要....学学....学学学......编编编...程...程程....";
System.out.println(s);
String regex="\\.+";//先将 . 去掉
s=s.replaceAll(regex,"");//去掉 .
System.out.println(s);
regex="(.)\\1+";//将重复的内容变成单个内容
s=s.replaceAll(regex,"$1");//去重
System.out.println(s)
}
//匹配邮箱
public static void checkMail()
{
String mail="123a809bc@sina.com.cn";
String regex="\\w+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}";//较为精确
//regex="\\w+@\\w+(\\.\\w+)+";//相对不太精确的匹配。
boolean b=mail.matches(regex);
System.out.println(b);
}
/*
需求:
将ip地址进行地址段顺序的排序。
192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.301
思路:
还按照字符串自然顺序,只要让他们每一段都是3位即可。
1、按照每一段需要的最多的0进行补齐,那么每一段就会至少保证有3位。
2、将每一段只保留3位。这样,所有的ip地址都是每一段3位。
*/
public static void iPSort()
{
String ip="192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.301";
System.out.println(ip);
String regex="(\\d+)";
ip=ip.replaceAll(regex,"00$1");//保证每段至少都有三位
System.out.println(ip);
regex="0*(\\d{3})";
ip=ip.replaceAll(regex,"$1");//每段只保留三位
System.out.println(ip);
regex=" ";
String[] arr=ip.split(regex);//按照空格切
//定义一个TreeSet集合,利用元素自然排序
TreeSet<String > ts=new TreeSet<String>();
for (String str : arr )
{
ts.add(str);//添加
}
regex="0*(\\d)";//把每段前面多余的0替换掉
for (String s : ts)
{
System.out.println(s.replaceAll(regex,"$1"));//把每段前面多余的0替换掉
}
}
/*
网络爬虫(蜘蛛)
实际上是一个功能,用于搜集网络上的指定信息
需求:可用于收集邮箱,qq号等之类的信息。
应用:如通过关键字搜索blog,实际就是使用的“蜘蛛”,通过查找关键字获取相关的blog
*/
//获取网页中mail
public static void getWebMail()throws Exception
{
//封装网页地址
URL url=new URL("http://tieba.baidu.com/p/1390896758");
//连接服务器
URLConnection conn=url.openConnection();
//带缓冲区的网页读取流
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line=null;
//定义匹配邮件地址的正则表达式
String regex="\\w+@\\w+(\\.\\w+)+";
Pattern p=Pattern.compile(regex);//封装正则表达式
//读取网页数据
while ((line=br.readLine())!=null)
{
//正则关联数据
Matcher m=p.matcher(line);
//寻找匹配邮箱
while (m.find())
{
System.out.println(m.group());//输出匹配邮箱
}
}
}
//获取指定文档中的邮件地址。使用获取功能。Pattern Matcher
public static void getFileMail()throws Exception
{
//将文件封装成对象
File file=new File("E:\\Java Study\\Practice\\day25\\mail.txt");
//创建带缓冲区的读取流
BufferedReader br=new BufferedReader(new FileReader(file));
String line=null;
//定义正则表达式
String regex="\\w+@[a-zA-Z]+(\\.[a-zA-z]+)+";
//创建Pattern对象,封装正则表达式
Pattern p=Pattern.compile(regex);
//读取文件中数据
while ((line=br.readLine())!=null)
{
//关流字符串
Matcher m=p.matcher(line);
while (m.find())//寻找匹配的字符串
{
System.out.println(m.group());//输出匹配的字符串
}
}
}
}