黑马程序员_正则表达式

-----Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

正则表达式:其实是用来操作字符串的一些规则。


3.1,好处:正则的出现,对字符串的复杂操作变得更为简单。


3.2,特点:将对字符串操作的代码用一些符号来表示。只要使用了指定符号,就可以调用底层的代码对字符串进行操作。符号的出现,简化了代码的书写。


3.3,弊端:符号的出现虽然简化了书写,但是却降低了阅读性。


其实更多是用正则解决字符串操作的问题。


组:用小括号标示,每定义一个小括号,就是一个组,而且有自动编号,从1开始。


只要使用组,对应的数字就是使用该组的内容。别忘了,数组要加\\。


(aaa(wwww(ccc))(eee))技巧,从左括号开始数即可。有几个左括号就是几组。


具体的操作功能:


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


2),切割:String split();


3),替换:replaceAll()


4),获取


class  RegexDemo
{
 public static void main(String[] args) 
 {
  //checkQQ();
  //splitDemo();
  replaceAllDemo();
 }
 
 public static void replaceAllDemo()
 {
  String str = "klahfkkkkkassdfkaahfiwj"; //将重叠的字母转换成单个字母 kkkk-->k
  str = str.replaceAll("(.)\\1+","$1");
  //String str = "klahfkkkkkassdfkaahfiwj"; //将叠字转换成#号
  //str = str.replaceAll("(.)\\1+","#");


  //String str = "aljg4534lajf355545442oajdl1385456224ajfa"; //将字符串中的数字替换成#号
  //str = str.replaceAll("\\d{1,}","#");


  System.out.println(str);
 }


 public static void splitDemo()
 {
  //String str = "klahfkkkkkassdfkaaahfiwj";
  //String reg = "(.)\\1+";  //按照多个叠字使用捕获组的方式来切


 //String str = "klahfkkassdfkaahfiwj";
  //String reg = "(.)\\1"; //按照叠字使用捕获组的方式来切
  String str = "C:\\abc\\a.txt";
  String reg = "\\\\";  //切文件
  //String str = "zhangsan    lisi    wangwu";
  //String reg = " +"; //按照一个或多个空格来切


  //String str = "zhangsan,lisi,wangwu";
  //String reg = ",";
  String[] arr = str.split(reg);
  System.out.println(arr.length);
  for(String s : arr)
  {
   System.out.println(s);
  }
 }


 public static void checkTel()
 {
  //13xxx  18xxx  15xxxx
  String tel = "";
  String regex = "1[358]\\d{9}";
  boolean flag = tel.matches(regex);


 }
 //使用正则表达式的方法
 public static void checkQQ()
 {
  String qq = "54263";
  String regex = "[1-9][0-9]{4,14}";//表示第一位是1到9的数字,后面的数字0到9,出现4到15次
  boolean flag = qq.matches(regex);
  if (flag)
  {
   System.out.println(qq+"...is ok");
  }
  else
  {
   System.out.println("nonononono");
  }
 }
 对QQ号码进行校验
 要求:5~15位,0不能开头,只能是数字


 //一般方法
 //这种方式,使用了String类中的方法,进行组合完成了需求,但是代码过于复杂
 public static void checkQQ_1()
 {
  String qq = "16d645544";
  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("出现非法字符。。。。。");
    }


    /*
    判断qq中是否全部是数字


    char[] arr = qq.toCharArray();
    boolean flog = false;
    for (int x=0; x<arr.length; x++)
    {
     if (arr[x]>='0' && arr[x]<='9')
     {
      flog = true;
     }
     else
     {
      flog = false;
      break;
     }
    }


    if (flog)
    {
     System.out.println("qq:"+qq);
    }
    else
    {
     System.out.println("qq输入不合法");
    }
    */


   }
   else
   {
    System.out.println("qq不能以0开头");
   }
  }
  else
  {
   System.out.println("qq长度错误");
  }
 }
}


/*
正则表达式的第四个功能;
4,获取 将字符串中的符合规则的子串取出


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


*/
import java.util.regex.*;


class  RegexDemo2
{
 public static void main(String[] args) 
 {
  String str = "hai you ba tian jiu yao jin xing mian shi"; //想要获取三个字母连一块的子串
  System.out.println(str);


  String reg = "\\b[a-z]{3}\\b"; //字母出现三次  \\b 是边界符


  //将规则封装成对象。
  Pattern p = Pattern.compile(reg);


  //让正则对象和要作用的字符串相关联,获取匹配器对象。
  Matcher m = p.matcher(str);


  //System.out.println(m.matches());
  /*其实Sring 类中的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()); 
  }
 }
}


练习:


import java.util.*;
class  RegexTest
{
 public static void main(String[] args) 
 {
  //ipSort();
  checkMail();
 }
 需求:对邮件地址进行校验
 public static void checkMail()
 {
  String mail = "abc563@sina.com";


  String reg = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z])+"; //较为精确匹配
  reg = "\\w+@\\w+(\\.\\w+)+";


  System.out.println(mail.matches(reg));
 }
 /*
 192.168.1.108 102.15.25.12 10.10.10.10 2.2.2.2 8.108.65.34
 将ip地址进行地址顺序的排序


 还按照字符串自然排序,只要让他们每一段都是3位即可
 1),按照每一段需要的最多的0进行补齐,那么每一段就会至少保证有3位
 2),将每一段知保留3位,这样,所有的ip地址都是每一段3位


 */
 public static void ipSort()
 {
  String ip = "192.168.1.108 102.15.25.12 10.10.10.10 2.2.2.2 8.108.65.34";


  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(" ");
  for(String s : arr)
  {
   System.out.println(s);
  }


  System.out.println(".....................");


  TreeSet<String> tr = new TreeSet<String>();
  for(String s : arr)
  {
   tr.add(s);
  }


  for(String s : tr)
  {
   System.out.println(s.replaceAll("0*(\\d+)","$1"));
  }
 }
 /*
 将下列字符串转成:我要学编程


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


 思路:
 1),如果只想要知道该字符串是否 对或错,使用匹配
 2),想要将已有的字符串变成另一个字符串,使用替换
 3),想要按照指定的方式将字符串变成多个字符串,切割,获取规则以外的子串
 4),想要拿到符号需求的字符串子串,获取,获取符号规则的子串
  将已字符串变成另一个字符串,使用替换功能。
 1),可以先将. 去掉
 2),再将多个重复的内容变成单个内容


 */
 public static void test_1()
 {
  String str = "程程";
  str = str.replaceAll("\\.+","");


  System.out.println(str);


  str = str.replaceAll("(.)\\1+","$1");
  System.out.println(str);
 }
}
/*
网页爬虫(蜘蛛) 获取网站上的邮箱
import java.io.*;
import java.util.regex.*;


class  RegexTest2
{
 public static void main(String[] args) throws Exception
 {
  getMail_2();
 }
 //从网页上获取邮箱地址
 public static void getMail_2()throws Exception
 {
  URL url = new URL("http://www.baidu.com"); //获取服务端的url


  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)
  {
   //System.out.println(line);


   Matcher m = p.matcher(line);        //判断是否是该模式下的邮箱
   while (m.find())
   {
    System.out.println(m.group());
   } 
  }
 }
 /*
 获取指定文档中的邮件地址。
 使用获取功能: Pattern Matcher
 */
 public static void getMail_1()throws Exception
 {
  BufferedReader bufr = 
   new BufferedReader(new FileReader("mail.txt"));


String mailReg = "\\w+@\\w+(\\.\\w+)+";    //获取该模式下的邮箱
  Pattern p = Pattern.compile(mailReg);
  String line = null;
  while ((line = bufr.readLine()) != null)
  {
   //System.out.println(line);


   Matcher m = p.matcher(line);    //判断是否匹配
   while (m.find())
   {
    System.out.println(m.group());
   } 
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值