一、正则表达式(特点)
正则表达式:符合一定规则的表达式。
特点:用一些特定的符号来表示一些代码操作,这样就简化书写。
所以学习正则表达式就是在学习一些特殊符号的使用。
作用:用于操作字符串。
好处:可以简化对字符串的复杂操作。
弊端:符号定义越多,正则越长,阅读性越差。
先来看一个示例:
- /*
- 示例:
- */
- class RegexDemo
- {
- public static void main(String[] args)
- {
- checkQQ_1();
- checkQQ_2();
- }
- /*
- 对QQ号码进行校验:
- 要求:5-15位。0不能开头,只能是数字。
- */
- public static void checkQQ_2()//使用正则表达式
- {
- String qq="1a234576";
- String regex="[1-9][0-9]{4,14}";
- boolean flag=qq.matches(regex);
- if(flag)
- {
- System.out.println("QQ:"+qq);
- }
- else
- {
- System.out.println("输入不合法");
- }
- }
- public static void checkQQ_1()//这种方式使用String类中的方法,进行组合完成了需求。但是代码国语复杂。
- {
- String qq="123456";
- int len=qq.length();
- if(len>=5 && len<=15)
- {
- if(!qq.startsWith("0"))
- {
- try
- {
- Long l=Long.parseLong(qq);
- System.out.println("QQ:"+l);
- }
- catch (NumberFormatException e)
- {
- System.out.println("出现非法字符");
- }
- /*
- char[] arr=qq.toCharArray();
- boolean flag=true;
- for(int i=0;i<arr.length;i++)
- {
- if(!(arr[i]>='0' && arr[i]<='9'))
- {
- flag=false;
- break;
- }
- }
- if(flag)
- {
- System.out.println("qq:"+qq);
- }
- else
- {
- System.out.println("出现非法字符");
- }
- */
- }
- else
- {
- System.out.println("不可以以0开头");
- }
- }
- else
- {
- System.out.println("长度错误。");
- }
- }
- }
二、正则表达式(匹配)
- /*
- 具体操作功能:
- 1.匹配。public boolean matches(String regex):告知此字符串是否匹配给定的正则表达式。
- */
- class RegexDemo2
- {
- public static void main(String[] args)
- {
- checkTel();
- }
- public static void checkTel()//手机号码段只有 187******** 150******** 178********
- {
- String str1="18712334567";
- String str2="10012334567";
- String reg="1[578]\\d{9}";
- System.out.println(str1.matches(reg));
- System.out.println(str2.matches(reg));
- }
- }
三、正则表达式(切割)
- /*
- 具体操作功能:
- 2.切割。public String[] split(String regex):根据给定正则表达式的匹配拆分此字符串。
- */
- class RegexDemo3
- {
- public static void main(String[] args)
- {
- splitDemo("zhangsan lisi wangwu zhaoliu"," +");//切割包含多个空格的
- System.out.println();
- splitDemo("zhangsan.lisi.wangwu.zhaoliu","\\.");//切割包含.的
- System.out.println();
- splitDemo("c:\\abc\\a.txt","\\\\");//切割目录
- System.out.println();
- splitDemo("asdfassssdjfkzzzzzzodff","(.)\\1+");/*
- 按照叠词完成切割,为了可以让规则的结果被重用,
- 可以将规则封装成一个组,用()完成。组的出现都有编号,
- 从1开始,想要使用自己已有的组,可以通过\n(n是组的编号)
- 的形式来获取。
- */
- }
- public static void splitDemo(String str,String reg)
- {
- String[] arr=str.split(reg);
- for(String s:arr)
- {
- System.out.println(s);
- }
- }
- }
四、正则表达式(替换)
- /*
- 具体操作功能:
- 3.替换。public String replaceAll(String regex,String replacement):
- 使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
- */
- class RegexDemo4
- {
- public static void main(String[] args)
- {
- String str1="asdvfsa123124356asjdf4334543234iupok43234123fsa";
- replaceAllDemo(str1,"\\d{5,}","#");//将字符串中的数字长度大于5的子段替换成#
- String str2="asdfssswqqqfsdffff";//将重叠的字符替换成单个字母。例如: ssss----->s
- replaceAllDemo(str2,"(.)\\1+","$1");
- }
- public static void replaceAllDemo(String str,String reg,String newStr)
- {
- str=str.replaceAll(reg,newStr);
- System.out.println(str);
- }
- }
五、正则表达式(获取)
- /*
- 具体操作功能:
- 4.获取:将字符串中的符合规则的子串取出。
- 步骤:
- 1.将正则表达式封装成对象。
- 2.让正则对象和要操作的字符串相关联。
- 3.关联后,获取正则匹配引擎。
- 4.通过引擎对符合规则的字串进行操作,例如取出。
- */
- import java.util.regex.*;
- class RegexDemo5
- {
- public static void main(String[] args)
- {
- getDemo();
- }
- public static void getDemo()
- {
- String str="java ji chu";
- String reg="\\b[a-z]{3}\\b";
- //将规则封装成对象。
- Pattern p=Pattern.compile(reg);
- //让正则对象和要作用的字符串相关联,获取匹配器对象。
- Matcher m=p.matcher(str);
- //System.out.println(m.matches());/*String类中的matches方法用的就是Pattern和Matcher对象来完成的*/
- /*只不过被String的方法封装后,用起来较为简单,但功能单一。*/
- //System.out.println("matches:"+m.matches());//注意:同一个匹配器用的同一个指针。
- while(m.find())//将规则作用到字符串上,并进行符合规则的子串查找。
- {
- System.out.println(m.group());//用于获取匹配后结果。
- }
- }
- }
六、正则表达式(练习1)
- /*
- 需求:
- 将下列字符串转成:我要学编程
- 用四种功能的哪一个呢?或哪几个呢?
- 思路:
- 1.如果只想知道该字符是否是对是错,使用匹配。
- 2.想要将已有的字符串变成另一个字符串,替换。
- 3.想要按照自定的方式将字符串编程多个字符串,切割。获取规则以外的子串。
- 4.想要拿到符合要求的字符串的字串,获取。获取符合规则的子串。
- */
- class RegexText
- {
- public static void main(String[] args)
- {
- test_1();
- }
- public static void test_1()
- {
- String str="我我我我.....我我我我..要..要要要要要...要要要要.学.学.学学学.编.编..编编编.程.程程程.程";
- /*
- 将已有字符串编程另一个字符串,使用替换功能。
- 1.可以现将.去掉
- 2.再将多个重复的内容变成单个内容。
- */
- str=str.replaceAll("\\.+","");
- System.out.println(str);
- str=str.replaceAll("(.)\\1+","$1");
- System.out.println(str);
- }
- }
七、正则表达式(练习2)
- /*
- 192.168.1.1 102.49.23.013 10.10.10.10 2.2.2.8 8.109.90.30
- 将ip地址进行地址段顺序排序。
- 还按照字符串自然顺序,只要让它们每一段都是3位即可。
- 1.按照每一段需要的对多的0进行补齐,那么每一段就会至少保证有3位。
- 2.将每一段只保留3位。这样,所有的ip地址都是每一段3位。
- */
- import java.util.*;
- class RegexText2
- {
- public static void main(String[] args)
- {
- ipSort();
- checkMail();
- }
- public static void ipSort()
- {
- String ip="192.168.1.1 102.49.23.013 10.10.10.10 2.2.2.8 8.109.90.30";
- ip=ip.replaceAll("(\\d+)","00$1");
- System.out.println(ip);
- ip=ip.replaceAll("0*(\\d{3})","$1");
- System.out.println(ip);
- String[] arr=ip.split(" ");
- TreeSet<String> ts=new TreeSet<String>();
- for(String s:arr)
- {
- ts.add(s);
- }
- System.out.println();
- for(String s:ts)
- {
- System.out.println(s.replaceAll("0*(\\d+)","$1"));
- }
- }
- public static void checkMail()
- {
- String mail="abc@sohu.com.cn";
- String reg="[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}";//精确匹配
- //reg="\\w+@\\w+(\\.\\w+){1,3}";//相对不太精确的匹配 1@2.1 就没意义了
- System.out.println();
- System.out.println(mail.matches(reg));
- }
- }
八、正则表达式(网页爬虫)
网页:
- <html>
- <head>
- <title>
- 邮件获取
- </title>
- </head>
- <body>
- <div>
- djkfjalksdjflkdsajf zhangsan@126.com asdfaewfsdaf;wefaskjfdalkdsf
- alewjflkadsg lisi@sohu.com aslkjf;lsakdfj;oiewajflakjdsg;lkajdsgaaldskfljklj
- fdjglkadjglkasdjf;lkjdsaf;lksaef ;lrsjg;;rajg aslkd;kdjflkjlsad
- arewjgalkfdjg;lkfdajg; w wangwu@126.com eokflasjglkajfd;glaijdg;
- welkjliewajugijfdalkg arj;lewaoigfla
- </div>
- </body>
- </html>
- /*
- 网页爬虫(蜘蛛)。
- */
- import java.net.*;
- import java.io.*;
- import java.util.regex.*;
- class RegexText3
- {
- public static void main(String[] args)throws Exception
- {
- getMails();
- }
- public static void getMails()throws Exception
- {
- /*
- 获取邮件地址。使用Pattern Matcher
- */
- URL url=new URL("http://172.16.56.254:8080/myweb/mail.html");
- URLConnection conn=url.openConnection();
- BufferedReader bufrIn=new BufferedReader(new InputStreamReader(conn.getInputStream()));
- String line=null;
- String mailreg="\\w+@\\w+(\\.\\w+){1,3}";
- Pattern p=Pattern.compile(mailreg);
- while((line=bufrIn.readLine())!=null)
- {
- Matcher m=p.matcher(line);
- while(m.find())
- {
- System.out.println(m.group());
- }
- }
- }
- }