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

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

1、正则表达式(特点)

正则表达式:符合一定规则的表达式。

       作用:用于专门操作字符串。

       特点:用于一些特定的符号来表示一些代码操作,这样就简化了书写。

       好处:可以简化对字符串的复杂操作。

       弊端:符号定义越多,正则越长,阅读性越差


2、正则表达式(匹配、切割、替换)

具体操作功能:

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

2.切割:String split();

3.替换: String replaceAll();

class RegexDemo
{
       public static void main(String[] args)
       {
              //checkQQ();
              //checkTel();
              //splitDemo("zhangsan.lisi.wangwu","\\.");
              //splitDemo("C:\\abc\\a.txt","\\\\");
              //splitDemo("erkktyqquizzzzolankgkkdad","(.)\\1+");
              /*按照叠词完成切割,为了可以让规则的结果被重用,可以将规则封装成一个组,用()完成,组的出现都有编号,从1开始,想要使用已有的组可以通过 \n(n就是组的编号)的形式来获取如何区分组呢?例如((())()),方法是按左括号从左往右数,有几个左括号就有几个组,组的编号按照左括号的顺序来区分
*/
              String str ="wer1389985yya9uqioutqakln09eutoiuqteqwr27845";//将字符串中的数组替换成#
              //replaceAllDemo(str,"\\d{5,}","#");
 
              String str1 ="erkktyqqquizzzzzo";//将叠词替换成&  //将重叠的字符替换成单个字母。zzzzz-->z
              replaceAllDemo(str1,"(.)\\1+","$1");
       }
       public static void replaceAllDemo(String str,String reg,String newStr)
       {
              str = str.replaceAll(reg,newStr);
 
              System.out.println(str);
 
       }
 
       //切割
       public static void splitDemo(String str,String reg)
       {
              //String reg = " +";//按照多个空格来进行切割
              String[] arr = str.split(reg);
 
              for(String s : arr)
              {
                     System.out.println(s);
              }
       }


       匹配手机号

       手机号段只有13xxx,15xxx,

      public static void checkTel()
       {
              String tel = "15623075885";
 
              String regex ="[1][358]\\d{9}";
 
              boolean b = tel.matches(regex);
 
              if(b)
                     System.out.println(tel+"正确手机号");
              else
                     System.out.println(tel+"非法手机号");
       }
       public static void checkQQ()
       {
              String qq = "";
 
              String regex ="[1-9][0-9]{4-14}";
 
              boolean flag = qq.matches(regex);
 
              if(flag)
                     System.out.println(qq+"....isok!");
              else
                     System.out.println(qq+"......不合法!");
       }

       /*

       对QQ号进行校验

       要求:5-15    0不能开头,只能是数字

       这种方式,使用了String类中的方法,进行组合完成了需求,但是代码过于复杂。

       */

  public static void checkQQ_1()
       {
              String qq = "07233009";
              int len = qq.length();
              if(len>=5 && len<=15)
              {
                     if(!qq.startsWith("0"))//Ingeter.parseInt("12a");//NumberFormatException
                     {
                            try
                            {
                                   longl = Long.parseLong(qq);
                                   sop("qq:"+l);
                            }
                            catch (NumberFormatException e)
                            {
                                   sop("出现非法字符....");
                            }
                            /*
                            char[] arr = qq.toCharArray();//将qq转换成字符数组
                            boolean flag = true;//定义标记
                            for(int x=0; x<arr.length; x++)
                            {
                                   if(!(arr[x]>='0'&& arr[x]<='9'))
                                   {
                                          flag = false;
                                          break;
                                   }
                            }
                            if(flag)
                            {
                                   sop("qq:"+qq);
                            }
                            else
                            {
                                   sop("出现非法字符");
                            }
                            */
                     }
                     else
                     {
                            sop("不可以0开头");
                     }
              }
              else
              {
                     sop("长度错误");
              }
             
       }
       public static void sop(Object obj)
       {
              System.out.println(obj);
       }
}


3、正则表达式(获取)

获取:将字符串中符合规则的字串取出

操作步骤:

1.将正则表达式封装成对象;

2.让正则对象和要操作的字符串相关联;

3.关联后,获取正则匹配引擎;

4.通过引擎对符合规则的字串进行操作,比如取出。

public final class Pattern extends Objectimplements Serializable  正则表达式的编译表示形式

import java.util.regex.*;
class RegexDemo2
{
       public static void main(String[] args)
       {
              getDemo();
       }
       public static void getDemo()
       {
              String str = "ming tian jiu yao fangjia le,da jia.";
              //str = "123456";
              //String reg ="[1-9]\\d{4,14}";
              String reg = "\\b[a-z]{4}\\b";//\b表示单词边界
 
              //将规则封装成对象
              Pattern p = Pattern.compile(reg);
 
              //让正则对象和要作用的字符串相连接,获取匹配器对象。
              Matcher m = p.matcher(str);
 
              //System.out.println(m.matches());//其实String类中的matches方法,用的就是Pattern和Matcher对象来完成的。
                                                                      //只不多被String的方法封装后,用起来较为简单,但是功能却单一。
             
              //boolean b = m.find();//将规则作用到字符串上,并进行符合规则的字串查找
              //System.out.println(b);
//            System.out.println(m.group());//用于获取匹配后的结果
 
              while(m.find())
              {
                     System.out.println(m.group());
                     System.out.println(m.start()+"..."+m.end());
              }
       }
}
注意:在进行查找获取前,不能在其前面再添加匹配,否则获取到的数据会出现错误,例如matches()会提前匹配,然后其索引位就会一次往后推移


4、正则表达式(练习)

import java.util.*;
class RegexTest
{
       public static void main(String[] args)
       {
              //test_1();
              //ipSort();
              checkMail();
       }
       /*
       需求:对邮件地址进行校验
       */
       public static void checkMail()
       {
              String str ="yinbolove576@sina.com";
 
              String reg ="[a-zA-Z_0-9]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";//较为精确的匹配
              reg = "\\w+@\\w+(\\.\\w+)+";//相对不太精确的匹配
              //mail.indexOf("@")!=-1;
 
              System.out.println(str.matches(reg));
       }

       /*

       需求:将下列字符串转成:我要学编程

       到底用四种功能中的哪一个呢?或者哪几个呢?

       思路方式:

       1.如果只想知道该字符是否对是错,使用匹配;

       2.想要将已有的字符串变成另一个字符串,替换。

       3.想要按照自定义的方式将字符串编程多个字符串,切割。获取规则以外的字串;

       4.想要拿到符合需求的字符串字串,获取,获取符合规则的字串。

       */

      public static void test_1()
       {
              String str = "我我...我我...我要..要要...要要...学学学...学学...编编编...编程..程..程...程...程";
             
              str =str.replaceAll("\\.+","");
              System.out.println(str);
 
              str =str.replaceAll("(.)\\1+","$1");
              System.out.println(str);
 
       }

       /*

       192.168.1.254102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30

       将IP地址进行地址段顺序的排序。

       还按照字符串自然顺序,只要让它们每一段都是3位即可。

       1.按照每一段需要的最多的0进行补齐,那么每一段就会至少保证有3位。

       2.将每一段值保留3位,这样,所有的IP地址都是每一段3位。

       */

  public static void ipSort()
       {
              String ip = "192.168.1.254102.49.23.013 10.10.10.10 2.2.2.2 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 = newTreeSet<String>();
 
              for(String s :arr)
              {
                     ts.add(s);
              }
              for(String s:ts)
              {
                     System.out.println(s.replaceAll("0*(\\d+)","$1"));
              }
       }
}


5、网页爬虫(蜘蛛)

import java.io.*;
import java.util.regex.*;
import java.net.*;
class RegexTest2
{
       public static void main(String[] args) throws Exception
       {
              //getMails();
              getMails_1();
       }
 
//通过网页获取邮件地址
       public static void getMails_1()throws Exception
       {
              URL url = newURL("http://127.0.0.1:8080/myweb/mail.html");
              URLConnection conn =url.openConnection();
 
              BufferedReader bufIn =
                     new BufferedReader(new InputStreamReader(conn.getInputStream()));
 
              String line = null;
              String mailreg ="\\w+@\\w+(\\.\\w+)+";
              Pattern p = Pattern.compile(mailreg);
 
              while((line=bufIn.readLine())!=null)
              {
                     Matcherm = p.matcher(line);
                     while(m.find())
                     {
                            System.out.println(m.group());
                     }
              }
       }
       //通过本地文件获取邮件地址
       public static void getMails()throws Exception
       {
              BufferedReader bufr =
                     new BufferedReader(new FileReader("mail.txt"));
 
              String line = null;
 
              String mailreg ="\\w+@\\w+(\\.\\w+)+";
              Pattern p = Pattern.compile(mailreg);
 
              while((line=bufr.readLine())!=null)
              {
                     Matcherm = p.matcher(line);
                     while(m.find())
                     {
                            System.out.println(m.group());
                     }
              }
       }
}

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值