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

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

正则表达式

定义:用来操作字符串的一些规则,符合一定规则的表达式。

作用 :用于专门操作字符串
好处:正则的出现,可以简化对字符串的复杂操作
特点:用于一些特定的符号来表示一些代码操作,这样就简化书写。所以学习正则表达式,就是在学习一些特殊符号的使用。

弊端:符号定义越多,正则越长,阅读性越差。符号的出现虽然简化了书写,但是却降低了阅读性。其实更多是用正则解决字符串操作的问题。
组:用小括号标示,每定义一个小括号,就是一个组,而且有自动编号,从1开始。只要使用组,对应的数字就是使用该组的内容。别忘了,数组要加\\。(aaa(wwww(ccc))(eee))技巧,从左括号开始数即可。有几个左括号就是几组。

具体操作功能
1,匹配:boolean matches(String regex) 方法,(告知此字符串是否匹配给定的正则表达式)用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false
 2,切割:string split(String  reges)根据正则表达式的匹配拆分此字符串
            String[]split(String reges,int linit)根据匹配给定的正则表达式来拆分此字符串。
 3,替换:String replaceAll(String reges ,String replacement)使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
 4,获取:
1) 先要将正则表达式编译成正则对象。使用的是Pattern中静态方法 compile(regex);
2) 通过Pattern对象获取Matcher对象。
      Pattern用于描述正则表达式,可以对正则表达式进行解析。而将规则操作字符串,需要从新封装到匹配器对象Matcher中。然后使用Matcher对象的方法来操作字符串。
      如何获取匹配器对象呢?
      通过Pattern对象中的matcher方法。该方法可以正则规则和字符串想关联。并返回匹配器对象。
 3) 使用Matcher对象中的方法即可对字符串进行各种正则操作。

范例:

对QQ号码进行校验
 要求5-15,0补能开头,只能是数字


  1. public class RegexDemo {    
  2.      public static void main(String[] args) {    
  3.       checkQQ();    
  4.            /*splitDemo();  
  5.            splitDemo("zhangsan  wangwu lisi","\\.");*/    
  6.            //splitDemo("c:\\abc\\a.txt","\\\\");    
  7.            splitDemo("erkktykkuio","(.)\\1+");//按照叠词kk完成切割。为了可以让规则的结果被重用    
  8.              //可以将规则封装成一个组,用()完成,组的出现都有编号,从1开始,想要使用已有的组可以通过\n(n就是组的编号)的形式来获取。    
  9.              //((())()),有几个括号,就有几个组。    
  10.              String str="resagqetr1223dsfs43sdg340dfrg3444234";//将字符串中的数字替换成#    
  11.            replaceAllDemo(str,"\\d{5,}","#");    
  12.            String str1="adsfasgkkkkkkkkkasdgiouotisadgakssgasdgaskjgskio";//将叠词替换成&    
  13.            replaceAllDemo(str1,"(.)\\1+","&");    
  14.            String str2="adsfasgkkkkkkkkkasdgiouotisadgakssgasdgaskjgskio";//将重叠的字符替换成单个字母。zzz->z;    
  15.            replaceAllDemo(str2,"(.)\\1+","$1");//用$符号获取组。    
  16.     }    
  17.     public static void replaceAllDemo(String str,String reg,String newStr)    
  18.     {     
  19.   str=str.replace(reg, newStr);    
  20.   System.out.println(str);    
  21. }    
  22. public static void splitDemo(String str,String reg)    
  23. {    
  24.                  //String str="zhangsan  wangwu lisi";20 -1 88     
  25.                  //String str1="c:\\abc\\a.txt";    
  26.                  //String reg=" +";按照多个空格进行切割。    
  27.                     //String reg="\\.";    
  28.     String[] arr=str.split(reg);    
  29.     for(String s:arr)    
  30.     {    
  31.         System.out.println(s);    
  32.     }    
  33. }    
  34.     /*匹配手机号  
  35.       * 手机号段只有13***,15***********88,18***********8*/    
  36. public static void checkTel()    
  37. {    
  38.     String tel="";    
  39.          String telReg="1[358]\\d{9}";    
  40.          System.out.println(tel.matches(telReg));       
  41. }    
  42. public static void demo()    
  43. {       
  44.     String str="a";    
  45.     String reg="[bcd]";//规则一个字符,b,c,d中任何一个。    
  46.     String reg1="[bcd][a-k]";//规则第二个字符,第二个字符从a-k中一个。    
  47.     String reg2="\\d";//0-9预定义字符类,要\\出现。    
  48.     String reg11="[bcd]\\b?";//第二位可能出现一次或一次也没有。    
  49.     String reg21="[bcd]\\d{4,14}";//0-9预定义字符类,要\\出现。    
  50.     boolean b=str.matches(reg);    
  51.     System.out.println(b);    
  52.     }    
  53.           /*  对QQ号码进行校验  
  54.    * 要求5-15,0补能开头,只能是数字  
  55.    */    
  56. public static void checkQQ()    
  57. {    
  58.     String qq="";    
  59.     String regex="[1-9][0-9]{4,14}";//正则表达式。    
  60.            boolean flag=qq.matches(regex);    
  61.          if(flag)    
  62.     System.out.println(qq+".....is ok");    
  63.          else     
  64.     System.out.println(qq+".......不合法");    
  65. }    
  66.     
  67. <strong> /*  对QQ号码进行校验  
  68.  * 要求5-15,0补能开头,只能是数字  
  69.  * 这种方式使用了string类中的方法进行组合完成了需求,但代码过于复杂*/</strong>    
  70.         public static void  checkQQ_1()    
  71.         {    
  72.                String qq="12334435 32";    
  73.                int len=qq.length();    
  74.           if(len>=5&&len<=15)    
  75.          {    
  76.   if(!qq.startsWith("0"))//Integer.parseInt("12a");NumberFormatException.数字格式异常。    
  77.   {      
  78. try {    
  79.           long l=Long.parseLong(qq);    
  80.           System.out.println("qq"+l);    
  81.       } catch (NumberFormatException e) {    
  82.                System.out.println("出现非法字符。。。。。。。");    
  83.       }    
  84.                /*char[] arr=qq.toCharArray();  
  85.           boolean flag=true;  
  86.        for(int x=0;x<arr.length;x++)  
  87.         {  
  88.             if(!(arr[x]>='0'&&arr[x]<='9'))  
  89.                 flag=false;  
  90.         }  
  91.         if(flag)  
  92.         {  
  93.             System.out.println("qq:"+qq);  
  94.         }  
  95.         else  
  96.         {  
  97.             System.out.println("出现非法字符");  
  98.         }  
  99.         */    
  100.       }    
  101.       else    
  102.       {    
  103.               System.out.println("不可以0开头");    
  104.       }    
  105.   }    
  106.   else{System.out.println("长度错误");}    
  107. }    
  108. }    
 

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


  1. import java.util.regex.*;    
  2. public class RegexDemo2 {    
  3.     public static void main(String[] args) {        
  4.     }    
  5.     public static void getDemo()    
  6.     {    
  7.         String str="ming tian jiu yao fang jia le ,da jia.";    
  8.         System.out.println(str);    
  9.         String reg="\\b[a-z]{3}\\b";    
  10.         //将规则封装成对象。    
  11.         Pattern p=Pattern.compile(reg);    
  12.         //让正则对象和要作用的字符串str相关联,获取匹配器对象。    
  13.                Matcher m=p.matcher(str);    
  14.                   //System.out.println(m.matches());//其实string类中的matches方法,用的就是pattern和matcher对象来完成的。    
  15.               //只不过被string的方法封装后,用起来较为简单,但是功能却单一。    
  16.               /*boolean b=  m.find();//将规则作用到字符串上,并进行符合规则的子串查找  
  17.                 System.out.println(b);  
  18.               System.out.println(m.group());//用于获取匹配后结果。  
  19.                     */      
  20.                  //System.out.println("matches:"+m.matches());    
  21.     while(m.find())    
  22.     {    
  23.         System.out.println(m.group());    
  24.         System.out.println(m.start()+"....."+m.end());    
  25.     }    
  26. }    
  27. }    

范例:

将下列字符串转成:我要学编程。到底用四种功能中的哪一个呢?或者哪几个呢?
 思路方式:
 1,如果只想知道该字符是否对是错,使用匹配
 2,想要将已有的字符串变成另一个字符串,替换
3,想要按照自定的方式将字符串变成多个字符串,切割,获取规则以外的子串
4,想要拿到符合需求的字符串子串,获取,,获取符合规则的子串


  1. import java.util.TreeSet;    
  2. public class RegexTest {    
  3.     <strong>/**需求:  
  4.      * 将下列字符串转成:我要学编程。  
  5.      * 到底用四种功能中的哪一个呢?或者哪几个呢?  
  6.      * 思路方式:  
  7.      * 1,如果只想知道该字符是否对是错,使用匹配  
  8.      * 2,想要将已有的字符串变成另一个字符串,替换  
  9.      * 3,想要按照自定的方式将字符串变成多个字符串,切割,获取规则以外的子串  
  10.      * 4,想要拿到符合需求的字符串子串,获取,,获取符合规则的子串  
  11.      * @param args  
  12.      */</strong>    
  13.     public static void main(String[] args) {    
  14.         String str="我我。。。我。。我。。要。。。要要。。。。要要。。。。学学学。。。。。学学。。。编编编。。。。编编。。。程程。。。程程";    
  15.         /*将已有字符串变成另一个字符串,使用替换功能  
  16.          * 1,可以先将.去掉  
  17.          * 2,在将多个重复的内容变成单个内容  
  18.          * */    
  19.         str=str.replace("\\.+""");    
  20.         System.out.println(str);    
  21.         str=str.replace("(.)\\1+""$1");    
  22.         System.out.println(str);    
  23. <strong>/*  
  24.  * 192.68.1.254  102.49.23.012  010.23.23.34  4.4.4.2  8.34.53.34  
  25.  * 将IP地址进行地址段顺序的排序。  
  26.  * 还按照字符串自然顺序,只要让它们每一段都是3位即可  
  27.  * 1,按照每一段需要的最多的0进行补齐,那么每一段就会至少保证有3位,  
  28.  * 2,将每一段只保留3位,这样,所有的IP地址都是每一段3位。  
  29.  * */</strong>      
  30.     }    
  31.     public static void ipSort()    
  32.     {    
  33.      String ip="192.68.1.254  102.49.23.012  010.23.23.34  4.4.4.2  8.34.53.34";    
  34.      ip=ip.replaceAll("(\\d+)""00$1");    
  35.      System.out.println(ip);    
  36.      ip=ip.replaceAll("0*(\\d{3})""$1");    
  37.      System.out.println(ip);    
  38.      String[]arr=ip.split("");    
  39.      TreeSet<String>ts=new TreeSet<String>();    
  40.      for(String s:arr)    
  41.      {    
  42.          ts.add(s);     
  43.      }    
  44.      for(String s:ts)    
  45.      {    
  46.         System.out.println(s.replace("0*(\\d+)""$1"));     
  47.      }    
  48.     }    
  49.  <strong>  /*  
  50.     * 需求:对邮件地址进行校验  
  51.     *   
  52.    * */</strong>    
  53.     public static void checkMail()    
  54.     {    
  55.         String mail="abc123@sina.com";    
  56.         String reg="[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+";//较为精确的匹配。    
  57.         String reg1="[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}";    
  58.         String reg2="\\w+@\\w+\\w+";//相对补太精确的匹配。    
  59.                      //mail.indexOf("@")!=-1;错误的方式。    
  60.         System.out.println(mail.matches(reg));    
  61.     }    
  62. }    

  1. import java.io.*;    
  2. import java.net.*;    
  3. import java.util.regex.*;    
  4. public class RegexTest2 {    
  5.     
  6.     <strong>/**网页爬虫(蜘蛛)  
  7.      * @param args  
  8.      */</strong>    
  9.     public static void main(String[] args) throws Exception    
  10.     {    
  11.              getMails();    
  12.     }    
  13.     public static void getMails_1() throws Exception    
  14.     {    
  15.         URL url=new URL("http://192.198.2.3:8080/myweb/mail.html");    
  16.         URLConnection conn=url.openConnection();    
  17.         BufferedReader bufIn=new BufferedReader(new InputStreamReader(conn.getInputStream()));    
  18.         String line=null;    
  19.         String mailreg="\\w+@\\w+(\\.\\w+)+";    
  20.         Pattern p=Pattern.compile(mailreg);    
  21.         while((line=bufIn.readLine())!=null)    
  22.         {    
  23.             Matcher m=p.matcher(line);    
  24.             while(m.find())    
  25.             {    
  26.                 System.out.println(m.group());    
  27.             }    
  28.                                     //System.out.println(line);    
  29.         }    
  30.     }    
  31.     /*  
  32.     <strong> * 获取指定文档中的邮件地址  
  33.      * 使用获取功能pattern matcher  
  34. </strong>    * */    
  35.     public static void getMails() throws Exception    
  36.     {    
  37.         BufferedReader bufr=new BufferedReader(new FileReader("mail.txt"));    
  38.         String line=null;    
  39.         String mailreg="\\w+@\\w+(\\.\\w+)+";    
  40.         Pattern p=Pattern.compile(mailreg);    
  41.         while((line=bufr.readLine())!=null)    
  42.         {    
  43.             Matcher m=p.matcher(line);    
  44.             while(m.find())    
  45.             {    
  46.                 System.out.println(m.group());    
  47.             }    
  48.                                     //System.out.println(line);    
  49.         }    
  50.     }    
  51. }   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值