黑马程序员--java基础--正则表达式总结

------- android培训java培训、期待与您交流! ----------

目录:1.正则概述  2.常用符号及易错点 3.正则使用 4.String类中的正则  

1.正则概述

 

Pattern:正则表达式的编译表示形式

             指定为字符串的正则表达式必须首先被编译为此类的实例。

     Matcher:通过解释 Pattern 对执行字符串匹配操作的引擎。

             执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。

    典型的调用顺序:

            String  regex =\\w+@\\w+[.]((com)|(cn));

         String  str  =  "xxxxxxxxxxxxxx";

     Pattern p = Pattern.compile(regex);

     Matcher m = p.matcher(str);

     boolean b = m.matches();

     仅使用一次正则表达式时,可以方便地通过此类定义matches 方法。此方法编译表达式并在单个调用中将输入序列与其匹配。语句

     boolean b = Pattern.matches(regex,str);

     等效于上面的三个语句,尽管对于重复的匹配而言它效率不高,因为它不允许重用已编译的模式。

    

2.常用符号及易错点 

     1.  . 匹配单个字符    * 匹配0至多个在它之前的字符    + 匹配前面的子表达式一次或多次     

        ?匹配前面的子表达式零次或一次      | 将两个匹配表达式做或运算

     2. [ ]匹配括号中的任意一个字符      { } 匹配次数     

        () 将()之间括起来的表达式定义为组group,从左到右计算其开括号来编号。

        将匹配这个表达式的字符保存到一个临时区域,这个元字符在字符串提取的时候非常有用。

     3. ^  匹配一行的开始 ^spring       $匹配一行的结束 SPRING$

     4. 组:这个概念很重要,组是用括号划分的正则表达式,可以通过编号来引用组。

        组号从0开始,有几对小括号就表示有几个组,并且组可以嵌套,

        组号为0的表示整个表达式,组号为1的表示第一个组,依此类推。

        例如:A(B)C(D)E正则式中有三组,组0是ABCDE,组1是B,组2是D;

       A((B)C)(D)E正则式中有四组:组0是ABCDE,组1是BC,组2是B;组3是C,组4是D。


 

     易错点:

     \ 的使用:在其他语言中,\\表示要插入的是一个字符,java中\\表示要插入的是正则表达式中的反斜线,

             与后面的字符连在一起有特殊意义,如\\d,\\w等。

          如何在java的正则中插入一个\字符:代码为\\\\,因为在java中\\表示一个\。

          但是如果在java中使用回车换行等,则不需要多添加反斜线了,如回车直接为\r。

   

3.正则使用

     a.Matcher类的方法:

       boolean matches():尝试将整个区域与正则匹配

       boolean find():尝试查找与该模式匹配的下一个子序列          

       String group():返回由以前匹配操作所匹配的输入子序列
       Matcher reset():重置匹配器,依然对原序列进行匹配
       Mathcer reset(CharSequence input):重置此具有新输入序列的匹配器,对新的输入序列进行匹配
代码如下:
   public static void main(String[] args) throws IOException {  
//      定义正则并获取匹配器:   
        String regex = "(\\w)+[\\.](\\w)+[\\.]((com)|(cn))";  
        Pattern pattern = Pattern.compile(regex);  
        Matcher matcher = pattern.matcher("");  
        System.out.println(matcher.matches());  
//      打开网络资源   
        URL url = new URL("http://www.hao123.com/");  
        URLConnection urlConnection = url.openConnection();  
        InputStream ips = urlConnection.getInputStream();  
        BufferedReader bufr = new BufferedReader(new InputStreamReader(ips));  
        String line = null;  
//      对网络内容进行匹配并输出符合匹配模式的字符串,注意每一行都要重置具有新输入序列匹配器   
        while((line=bufr.readLine())!=null){  
            //对新输入序列进行重新匹配             
            matcher.reset(line);  
            while(matcher.find()){  
                System.out.println(matcher.group());  
            }  
        }  
//      关闭网络资源   
        ips.close();  

4.String类中的几个正则方法            

   个人理解为String类中关于正则的几个方法是为了使用方便而定义,不需要每次都去获取匹配器。

   总共有以下方法:

   boolean matches(String regex):告知此字符串是否匹配给定的正则表达式。

代码示例:

System.out.println("--------检验是否符合QQ号码规则----------");  
        获取输入的QQ字符串  
String strNum = new Scanner(System.in).nextLine();  
        定义正则:不能以0开头,5-10位数字  
String regex = "[^0][\\d]{4,9}";  
        进行匹配  
boolean matchResult = strNum.matches(regex);  
System.out.println(matchResult);  

String[] split(String regex):根据给定的正则表达式来匹配拆分此字符串

            等同于  Pattern.compile(regex).split(str);

    String[] split(String regex,int limit):  同上,只是限定了匹配模式的使用情况

            等同于  Pattern.compile(regex).split(str);

    String replaceAll(String regex, String replacement ):使用给定的replacement替换

            此字符串所有匹配给定正则表达式的子字符串。

代码示例如下:

//      去除重复汉字,要求打印效果为:我是程序员   
        String str = "我我我我....是是是是是....程程程程程...序。。。员";  
//      1.去除非汉字字符   
        String resultStr = str.replaceAll("[(\\.)|(。)]", "");  
//      2.定义重复字符的正则,定义替代元素,注意组的重复和单个字符的区别,注意$的使用   
        String regex1 = "(.)\\1+";  
        String replacement1 = "$1";  
        String finalStr = resultStr.replaceAll(regex1, replacement1);  
        System.out.println(finalStr);  

代码示例:对IP地址进行排序

String ipStr = "23.125.35.12 23.45.56.123 45.65.255.45";  
String ipStrRegex = ipStr.replaceAll("(\\d+)", "00$1");  
String ip = ipStrRegex.replaceAll("0*(\\d{3})", "$1");  
String[] ipArr = ip.split(" ");  
TreeSet<String> ts = new TreeSet<String>();  
for(String ipEle : ipArr){  
    ts.add(ipEle);  
}  
for(String ipEle : ts){  
    System.out.println(ipEle.replaceAll("0*(\\d+)","$1"));  
} 

------- android培训java培训、期待与您交流! ----------
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值