java基础__正则表达式


 

(1)什么是正则表达式? 

 正则表达式就是符合一定规则的表达式,正则表达式是对字符串操作的一种逻辑公式,就是用事先定

 义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,然后用这个"规则字符串"

  你的字符串相比较看看是不是匹配。

(2)正则表达式的特点:

 专门用于操作字符串的,它就是用于一些特定的符号来表示一些代码操作,可以简化书写。

  所以学习正则表达式,就是在学习一些特殊符号的使用

 

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

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

 

(3)正则表达式的具体操作功能:

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

 常见的有:

 


举个例子 

 /*需求:如何判断一个手机号码是否正确*/

      首先定义规则:第一位只能是"1"吧, 

      第二位是"3,5,8"中的其中一个吧,所以第二位的规则就是[3,5,8]

      第三位就是任意数字了,所以第三位的规则就是[0-9]或者是"\d"

      然后手机号一共是一位,第三位以后都是0-9,所以定义为[0-9]{9}

     所以匹配手机号的规则就是:String regex = 1[3,5,8][0-9]{9};

     然后拿你自定义的手机号与这个惠泽相匹配就行了   boolean b =  tel.matches(regex);



(4)切割:String split();


 部分代码:

 class  RegexDemo

 {

   public static void splitDemo(String str,String reg)

   {  

    //切割之后返回一个字符串数组

    String[] arr = str.split(reg); 

    //打印这个字符数组长度

    System.out.println(arr.length);

    //高级for循环遍历数组中的元素

    for(String s : arr)

    {

     System.out.println(s);

    }

   }

   public static void main(String[] args)

   {

     //"."处切割,因为"."在正则表达式中是一个特殊符号,所以要加反义字符"\""\."代表正则里

    // 面普通的一"",但是把"\."放字符串里的话是不是应该把"\" 也给转义下,"\\"相当于"\"

    splitDemo("zhangsan.lisi.wangwu","\\.");

    //在正则里面”\\“相当于一个”\,所以两个反斜杠就是”\\\\“喽

    splitDemo("c:\\abc\\a.txt","\\\\");

    //按照叠词完成切割。为了可以让规则的结果被重用可以将规则封装成一个组。用()完成。组

    //的出现都有编号。从1开始。 想要使用已有的组可以通过  \n(n就是组的编号)的形式来获取

    //"\n"的意思就是重用前面第n组的的结果,因为反斜杠是”\\“所以就是"(.)\\1+"

    splitDemo("erkktyqqquizzzzzo","(.)\\1+");       

   }

 }



(5)替换  String replaceAll(regex,str);

    用新字符串替换满足规则的子串如果regex中有定义组,可以在第二参

   数中通过$符号获取正则表达式中的已有的组。

  例如在网上发帖的时候有时候发的联系方式会被*号代替:


 部分代码:

   String str = "你好,我的联系方式是13000000000QQ123456";//将联系方式替换成*

   //数字连续出现五次以上就给屏蔽掉

 String s = str.replaceAll("\\d{5,}","***");

 System.out.println(s);

 // 将重叠的字符替换成单个字母。zzzz->z

 String str1 = "erkktyqqquizzzzzo";

   replaceAllDemo(str1,"(.)\\1+","$1");//获取前面那个组"(.)"的结果

 

  $符号可以用来获取组,"\"是用来获取本规则里面组的结果,而$是获取的是别的组里面的结果。



(6)获取:将字符串中的符合规则的子串取出。

 操作步骤:

  1,将正则表达式封装成对象。

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

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

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


 部分代码:

 import java.util.regex.*;

 class RegexDemo2 

 {

   public static void main(String[] args) 

   {

    getDemo();

    }

   public static void getDemo()

   {

    String str = "hello, da jia  hao wo shi...";

    System.out.println(str);

    String reg = "\\b[a-z]{3}\\b";//规则找出单词为三个字母的

    //将规则封装成对象。compile()Pattern类中的静态方法返回的是Pattern对象

    Pattern p = Pattern.compile(reg);

    //让正则对象和要作用的字符串相关联。获取匹配器对象。

    Matcher m  = p.matcher(str);

    //其实String类中的matches方法。用的就是PatternMatcher对象来完成只不过被String的方

    //法封装后,用起来较为简单。但是功能却单一。

    System.out.println(m.matches());的。

          

    while(m.find())//将规则作用到字符串上,并进行符合规则的子串查找。

    {

     System.out.println(m.group());//用于获取匹配后结果。

    }

  }

}



 (7)需求1: 将下列字符串转成:我要学编程.

 

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

 思路方式:

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

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

  3,想要按照自定的方式将字符串变成多个字符串。切割。获取规则以外的子串。

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


 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);

 }



(8)需求2:

192.68.1.254 102.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.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30";

   //把所有的数前都加两个零这样的话IP段是一个数的也凑成三个数了

  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(" ");//从空格处切割成String数组

   //建一个集合

   TreeSet<String> ts = new TreeSet<String>();

   for(String s : arr)

   {

    ts.add(s);//把字符串数组放到set集合里,这样他自己就排序了

   }

   for(String s : ts)//然后再遍历集合里的元素输出的就是排序之后的了

   {

    System.out.println(s.replaceAll("0*(\\d+)","$1"));

   }

 }


(9)网页爬虫(蜘蛛)

 class RegexTest2 

 {

   public static void main(String[] args) throws Exception

   {

    getMails_1();

   }

   /*

获取指定网页的邮件地址。

   使用获取功能。Pattern  Matcher

   */

   public static void getMails_1()throws Exception

   {

    URL url = new URL("http://192.168.1.254:8080/myweb/mail.html");

    URLConnection conn = url.openConnection();//创建连接,返回的是URLConnection对象

    //URLConnection对象里的方法获取流

    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)

    {

     Matcher m = p.matcher(line);

     while(m.find())

     {

      System.out.println(m.group());

     }

    }

   }

   /*

   获取指定文档中的邮件地址。

   使用获取功能。Pattern  Matcher

   */

  public static void getMails()throws Exception

   {

    //创建读取流获取文档中的内容

    BufferedReader bufr = 

    new BufferedReader(new FileReader("mail.txt"));

    String line = null;

    String mailreg = "\\w+@\\w+(\\.\\w+)+";

    //把正则表达式封装成Pattern对象

    Pattern p = Pattern.compile(mailreg);

    while((line=bufr.readLine())!=null)

  {

     //把正则表达式的对象与字符串相关联

     Matcher m = p.matcher(line);

     while(m.find())//find方法找出字符串中符合规则的

     {

      System.out.println(m.group());//然后获取打印出来

     }

    }

   }

 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值