------- android培训、java培训、期待与您交流! ----------
第一节:正则表达式
一、正则表达式的简述:
1 正则表达式:符合一定规则的表达式。
2 作用:用于专门操作字符串。
3 特点:用于一些特定的符号来表示一些代码操作。这样就简化书写。
4 好处:可以简化对字符串的复杂操作。
5 弊端:符号定义越多,正则越长,阅读性越差。
二、常见的功能:
1 功能的概述:
(1)、正则里面有 1匹配 2切割 3替换 4获取 四种方法进行对字符串操作。
注:其中123方法在String中都有相对应的方法matches(regex) split(regex) replaceAll(regex),而获取没有
获取的步骤:1将正则表达式封装成对象;p=Pattern.compile(reg)。2、让正则对象和要操作的字符串想关联;Matcherm=p.matcher(str)。
3、获取正则匹配matcher。4、通过引擎对符合规则的子串进行操作 比如:while(m.find()) m.group();
2 代码体现
import java.util.regex.*;
class RegexDemo
{
public static void main(String[] args)
{
//1匹配
getMatches();
// 2切割
getSplit();
// 3替换
getReplaceAll();
//4获取
getPatter();
}
public static void getPatter()
{
String ster="xiao jia hou,ni hao";
String regex="\\b[a-z]{3}\\b";
//将正则字符串编译成正则对象。
Pattern pat=Pattern.compile(regex);
//将正则对象与字符串相关连,并获取匹配器。
Matcher matcher=pat.matcher(ster);
//使用find()方法进行获取。
while (matcher.find())
{
System.out.println(matcher.group());
}
}
public static void getReplaceAll()
{
//电话号码
String stre="15514573033";
String regex="(\\d{3})(\\d{4})(\\d{4})";
String stte=stre.replaceAll(regex,"$1****$3");//当在第二个参数中使用第一个正则参数中的组时,可以使用$编号来完成组的调用。\\1只能使用在正则表达式中。
System.out.println(stte);
}
public static void getSplit()
{
//自定义字符串
String st="xiao#####jia*******hou@@@@@@ni$$$hao";
//定义规则
String regex="(.)\\1+";
String[] s=st.split(regex);
//for循环遍历
for (String ss:s)
{
System.out.println(ss);
}
}
public static void getMatches()
{
//匹配qq号,自定义号码
String str="54633d";
//自定义规则
String regex="[1-9]\\d{4,14}";
boolean b=str.matches(regex);
//打印
System.out.println(b+"................."+str);
}
}
注:()称之为组,按照叠词进行切割。叠词就是后者和前者一致。前者还是任意,必须后者在复用前者的内容。
必须在正则表达式中进行复用:将需要复用的内容进行封装,然后调用这个封装即可。
正则的复用用的是 () 来封装的,虽然没有名字,但是正则在使用()进行封装时,自动的给这些
小括号进行了编号,从1开始,称之为正则表达式中的组。通过组的编号就可以调用指定的组,进行复用。
3 小练习、
(1)、
import java.util.*;
class RegexTextDemo
{
public static void main(String[] args)
{
/*
* 练习一:
* 我我.....我我.我....我.要.要要.....要.要学....学...学学....学.学编..编....编..编.编.程程.程.....程.程程
* 还原成:我要学编程
*/
//思路:用到了,正则的替换功能。
getReplace();
/*
* 练习二:
* 127.0.0.1 3.3.3.3 192.168.104.23 10.10.10.10
* 要求按照ip地址的分类进行从小到大的排序。
*
*/
getEquals();
/*
* 练习三:校验电子邮件地址 E-mail。
*
*/
getMail();
}
public static void getMail()
{
String ssss="3958_0@ioerfj.com";//自定义字符串
//String regex="[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}";
String regex="\\w+@\\w+(\\.\\w+)+";//定义规则
System.out.println(ssss.matches(regex));//打印,验证
}
public static void getEquals()
{
String stre="127.0.0.1 3.3.3.3 192.168.104.23 10.10.10.10";
String regex="(\\d+)";//定义规则
String s=stre.replaceAll(regex,"00$1");//每个都添两个零
String rege="0*(\\d{3})";//去掉零都保留三位
String stt=s.replaceAll(rege,"$1");
System.out.println(stt);
String[] sst=stt.split(" +");//进行切割
Arrays.sort(sst);//对数组进行排序
//遍历打印数组中的元素
for (String ts:sst)
{
System.out.println(ts);
}
}
public static void getReplace()
{
String str ="我我.....我我.我....我.要.要要.....要.要学....学...学学....学.学编..编....编..编.编.程程.程.....程.程程";
String regex="\\.+";//定义规则
String sss=str.replaceAll(regex,"");//把..去掉
String rege="(.)\\1+";//定义规则
String ss=sss.replaceAll(rege,"$1");//在把叠词去掉
System.out.println(ss);//打印
}
}
(2)、
//网络爬虫:其实就是一个应用程序,获取网络中的指定信息(符合指定规则的信息)。
import java.util.*;
import java.io.*;
import java.util.regex.*;
import java.net.*;
class RegexTextDemo1
{
public static void main(String[] args)throws IOException
{
String regex="\\w+@\\w+(\\.\\w+)+";//定义规则
String str_url="http://www.douban.com/group/topic/23934101/?start=500";//在那个网页上进行爬
//File file=new File("1.txt");
List<String>list=getList(str_url,regex);
//for循环进行遍历打印
for (String s:list )
{
System.out.println(s);
}
}
public static List<String>getList(String str_url,String regex)throws IOException
{
List<String>list=new ArrayList<String>();
//将str_rul封装成url对象。
URL str_r=new URL(str_url);
//打开链接。
URLConnection urlc=str_r.openConnection();
//获取读取流。
InputStream is=urlc.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
//将正则字符串编译成对象,
Pattern p =Pattern.compile(regex);
String s=null;
while ((s=br.readLine())!=null)
{
Matcher matcher=p.matcher(s);
while (matcher.find())
{
list.add(matcher.group());
}
}
return list;
}
}