正则表达式

正则表达式:其实一种规则,有自己特殊的应用,其作用就是针对于字符串进行操作。

正则:就是用于操作字符串的规则,其中这些规则使用了一些字符表示。

快速体验正则表达式

需求:只能输入数字

 1 public class Demo2{
 2     
 3     public static void main(String[] args) {
 4         //只能输入数字
 5         String str = "124354232";
 6         char[] arr = str.toCharArray();
 7         boolean flag = true;
 8         for(int i = 0 ;  i< arr.length ; i++){
 9             if(!(arr[i]>=48&&arr[i]<=57)){
10                 flag = false;
11             }
12         }
13         System.out.println(flag?"输入正确":"输出只能是数字");
14     }
15     
16     
17 }
View Code

使用正则表达式:

 1 public class Demo2{
 2     
 3     public static void main(String[] args) {
 4         //只能输入数字
 5         String str = "12435423a2";
 6         boolean flag = str.matches("[0-9]+"); 
 7         System.out.println(flag?"输入正确":"只能输入数字");
 8         
 9     }
10 }
View Code

正则表达式的符号

预定义字符类

1 System.out.println("a".matches("."));
2 System.out.println("1".matches("\\d"));
3 System.out.println("%".matches("\\D"));
4 System.out.println("\r".matches("\\s"));
5 System.out.println("^".matches("\\S"));
6 System.out.println("a".matches("\\w"));
View Code

Greedy 数量词

1 System.out.println( "a".matches(".") );
2 System.out.println( "a".matches("a") );
3 System.out.println("a".matches("a?") );
4 System.out.println( "aaa".matches("a*") );
5 System.out.println( "".matches("a+") );
6 System.out.println( "aaaaa".matches("a{5}") );
7 System.out.println( "aaaaaaaaa".matches("a{5,8}") );
8 System.out.println( "aaa".matches("a{5,}") );
9 System.out.println( "aaaaab".matches("a{5,}") );
View Code

范围表示

        System.out.println( "a".matches("[a]") );
        System.out.println( "aa".matches("[a]+") );
        System.out.println( "abc".matches("[abc]{3,}") );
        System.out.println( "abc".matches("[abc]+") );
        System.out.println( "dshfshfu1".matches("[^abc]+") );
        System.out.println( "abcdsaA".matches("[a-z]{5,}") );
        System.out.println( "abcdsaA12".matches("[a-zA-Z]{5,}") );
        System.out.println( "abcdsaA12".matches("[a-zA-Z0-9]{5,}") );
        System.out.println( "abdxyz".matches("[a-c[x-z]]+"));
        System.out.println( "bcbcbc".matches("[a-z&&[b-c]]{5,}"));
        System.out.println( "tretrt".matches("[a-z&&[^b-c]]{5,}"));
View Code

 匹配功能

需求:校验QQ号,要求:必须是5~15位数字,0不能开头。没有正则表达式之前

 1 public static void checkQQ(String qq)
 2     {
 3         int len = qq.length();
 4         if(len>=5 && len <=15)
 5         {
 6             if(!qq.startsWith("0"))
 7             {
 8                 try
 9                 {
10                     long l = Long.parseLong(qq);
11                     System.out.println("qq:"+l);
12                 }        
13                 catch (NumberFormatException e)
14                 {
15                     System.out.println("出现非法字符");
16                 }
17             }
18             else
19                 System.out.println("不可以0开头");
20         }
21         else
22             System.out.println("QQ号长度错误");
23     }
View Code

有了正则表达式之后:

[1-9][0-9]{4,14}   [1-9]表示是第一位数字是会出现1-9范围之间的其中一个,下来的数字范围会出现在0-9之间,至少出现4次,最多出现14次。

public static void checkQQ2()         
{                                     
String qq = "12345";              
String reg = "[1-9][0-9]{4,14}";  
boolean b = qq.matches(reg);      
System.out.println("b="+b);                                 
}    
View Code

需求:匹配是否为一个合法的手机号码。

public static void checkTel()                                                   
{                                                                               
String tel = "25800001111";                                                 
String reg = "1[35]\\d{9}";//在字符串中,定义正则出现\ 要一对出现。         
boolean b= tel.matches(reg);                                                
System.out.println(tel+":"+b);                                              
}       
View Code

切割功能

需求1:根据空格对一段字符串进行切割。

public static void splitDemo()                              
    {                                                           
        String str = "aa.bb.cc";                                
        str = "-1     99    4    23";                           
        String[] arr = str.split(" +");                         
        for(String s : arr)                                     
        {                                                       
            System.out.println(s);                              
        }                                                       
    }    
View Code

需求2 :根据重叠词进行切割。

public static void splitDemo2()        
{                                      
String str = "sdqqfgkkkhjppppkl";
String[] arr = str.split("(.)\\1+");
for(String s : arr)                
{                                  
System.out.println(s);         
}                                  
                                       
}  
View Code

注意:为了提高规则复用,用()进行封装,每一个括号都有一个编号,从1开始,为了复用这个规则。可以通过编号来完成该规则的调用。需要对编号数字进行转义。\\1就代表获取1组规则。

替换功能

需求:把手机号替换成“*”号。

String str = "联系我:13567012119联系我:13567012119联系我:13567012119联系我:13567012119联系我:13567012119联系我:13567012119";
        String reg= "1[34578]\\d{9}";
        str =    str.replaceAll(reg,"******");
        System.out.println("替换后的帖子:"+ str);
View Code

获取

获取需要使用到正则的两个对象:使用的是用正则对象Pattern 和匹配器Matcher。

用法:

       范例:

        Pattern p = Pattern.compile("a*b");

        Matcher m = p.matcher("aaaaab");

        boolean b = m.matches();

       步骤:

       1,先将正则表达式编译成正则对象。使用的是Pattern类一个静态的方法。compile(regex);

       2,让正则对象和要操作的字符串相关联,通过matcher方法完成,并返回匹配器对象。

       3,通过匹配器对象的方法将正则模式作用到字符串上对字符串进行针对性的功能操作

需求:获取由3个字母组成的单词。

    public static void getDemo()
    {
        String str = "da jia zhu yi le,ming tian bu fang jia,xie xie!";
        //想要获取由3个字母组成的单词。
        //刚才的功能返回的都是一个结果,只有split返回的是数组,但是它是把规则作为分隔符,不会获取符合规则的内容。
        //这时我们要用到一些正则对象。
        String reg = "\\b[a-z]{3}\\b";
        Pattern p = Pattern.compile(reg);
        Matcher m = p.matcher(str);
        while(m.find())
        {
            System.out.println(m.start()+"...."+m.end());
            System.out.println("sub:"+str.substring(m.start(),m.end()));
            System.out.println(m.group());
        }
//        System.out.println(m.find());//将规则对字符串进行匹配查找。
//        System.out.println(m.find());//将规则对字符串进行匹配查找。
//        System.out.println(m.group());//在使用group方法之前,必须要先找,找到了才可以取。
    }
View Code

练习3:校验邮件

public static void checkMail()
    {
        String mail = "abc123@sina.com.cn";
        mail = "1@1.1";
        String reg = "[a-zA-Z_0-9]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";
        reg = "\\w+@\\w+(\\.\\w+)+";//简化的规则。笼统的匹配。
        boolean b = mail.matches(reg);
        System.out.println(mail+":"+b);
    }
View Code

练习4:网络爬虫

class GetMailList 
{
    public static void main(String[] args) throws Exception
    {
        String reg = "\\w+@[a-zA-Z]+(\\.[a-zA-Z]+)+";
        getMailsByWeb(reg);
    }
    
    
    public static void getMailsByWeb(String regex)throws Exception
    {
        URL url = new URL("http://localhost:8080/myweb/mail.html");
        
        URLConnection conn = url.openConnection();
        BufferedReader bufIn = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        String line = null;
        Pattern p = Pattern.compile(regex);        
        while((line=bufIn.readLine())!=null)
        {
            //System.out.println(line);
            Matcher m = p.matcher(line);
            while(m.find())
            {
                System.out.println(m.group());
            }
        }
        bufIn.close();
    }
    public static void getMails(String regex)throws Exception
    {
        BufferedReader bufr = 
            new BufferedReader(new FileReader("mail.txt"));
        String line = null;
        Pattern p = Pattern.compile(regex);        
        while((line=bufr.readLine())!=null)
        {
            //System.out.println(line);
            Matcher m = p.matcher(line);
            while(m.find())
            {
                System.out.println(m.group());
            }
        }
        bufr.close();
    }
}
View Code

 

posted on 2016-10-17 02:45  Michael2397  阅读(184)  评论(0编辑  收藏  举报

导航