正则表达式

正则表达式概述

正则表达式是指一个用来描述或者匹配一系列符合某种语法规则的字符串的单个字符串,其实就是一种规则,有自己特殊应用。

案例演示

需求:验证qq号码。
要求必须是5-15位数字
0不能开头
必须都是数字

public class test {
    public static void main(String[] args) {
        
        String regex="[1-9]\\d{4,14}";
        System.out.println("614932957".matches(regex));
        System.out.println("012345".matches(regex));
        System.out.println("614932957li".matches(regex));
        
    }
    
}
输出:
true
false
false
字符类

[abc] a、b、c(简单类)
[^abc] 任何字符,除了a、b、c(否定)
[a-zA-Z] a到z或者A到Z,两头的字母包含在内(范围)
[a-d[m-p]] a到d或者m到p:a-dm-p
[a-z&&[def]] d、e或f(交集)
[a-z&&[^bc]] a到z,除了b和c:ad-z
[a-z&&[^m-p]] a到z,而非m到p:[a-lq-z](减去)

预定义字符类

. 任何字符
\d 数字:[0-9]
\D 非数字:[^0-9]
\s 空白字符:[\t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]

数量词

X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好n次
X{n,} X,至少n次
X{n,m} X,至少n次,但是不超过m次

正则表达式的分割功能

public String[] split(String regex)

public class test {
    public static void main(String[] args) {
        
        String s="Lily.Liyuan.LiFang.LiHuan";
        String[] arr=s.split("\\.");  //通过正则表达式切割字符串
        for(int i=0;i<arr.length;i++)
            System.out.println(arr[i]);
        
    }
    
}
输出:
Lily
Liyuan
LiFang
LiHuan

案例:把给定字符串中的数字排序
需求:我有一个字符串:"91 27 46 38 50",请写代码实现最终输出结果是:"27 38 46 50 91"
分析:
1.将字符串切割成字符串数组
2.将字符串转换为数字并将其存储在一个等长度的int数组中
3.排序
4.将排序后的结果遍历并拼接成一个字符串

public class test {
    public static void main(String[] args) {
        
        int temp;
        String s="91 27 46 38 30";
        //1.将字符串切割成字符串数组
        String[] sArr=s.split(" ");  
        //2.将字符串转换为数字并将其存储在一个等长度的int数组中
        int[] arr=new int[sArr.length];
        for(int i=0;i<sArr.length;i++)
            arr[i]=Integer.parseInt(sArr[i]);
        
        
        //3.排序
        for(int i=0;i<arr.length;i++)
            for(int j=i+1;j<arr.length;j++)
            {
                if(arr[i]>arr[j]){
                    temp=arr[i];
                    arr[i]=arr[j];
                    arr[j]=temp;        
                }    
            }
        
        //4.将排序后的结果遍历并拼接成一个字符串
         StringBuffer sb=new StringBuffer();
        for(int i=0;i<arr.length;i++){
            if(i==arr.length-1)
                sb.append(arr[i]);
            else
                sb.append(arr[i]).append(" ");
        }
        
        System.out.println(str);
        
    }
}
输出:
27 30 38 46 91

正则表达式的替换功能

public String replaceAll(String regex,String replacement)

public class test {
    public static void main(String[] args) {
        String str="Lily0000LiYuan1111LiFang";
        String regex="\\d";
        String str2=str.replaceAll(regex, " ");
        System.out.println(str2);
    }
    
}
输出:
Lily    LiYuan    LiFang

正则表达式的分组功能

捕获组可以通过从左到右计算其开括号来编号。例如,在表达式((A)(B(C)))中,存在四个这样的组:
1.((A)(B(C)))
2.(A)
3.(B(C))
4.(C)

案例演示

1.切割

public class test {
    public static void main(String[] args) {
        
        //叠词  快快乐乐,高高兴兴
        String regex="(.)\\1(.)\\2";        //\\1代表第一组又出现一次,\\2代表第二组又出现一次
        System.out.println("快快乐乐".matches(regex));
        System.out.println("高高兴兴".matches(regex));
        System.out.println("死啦死啦".matches(regex));
        System.out.println("---------------------------");
        
        //叠词  死啦死啦,高兴高兴
        String regex2="(..)\\1";        //\\1代表第一组又出现一次
        System.out.println("快快乐乐".matches(regex2));
        System.out.println("高兴高兴".matches(regex2));
        System.out.println("死啦死啦".matches(regex2));
        
    }
    
}
输出:
true
true
false
---------------------------
false
true
true

public class test {
    public static void main(String[] args) {
                   //按照叠词切割:"sdqqfgkkkhjppppkl"
        String s="sdqqfgkkkhjppppkl";
        String regex="(.)\\1+";   //+表示第一组出现一次或者多次
        String[] arr=s.split(regex);
        for(int i=0;i<arr.length;i++)
            System.out.println(arr[i]);
        
    }
    
}
输出:
sd
fg
hj
kl
public class test {
    public static void main(String[] args) {
        
        /*需求:"我我....我...我.要...要要...要学....学学..学.编..编编.编.程.程.程.程"
                      将字符串还原为:"我要学编程"*/
        
        String s="我我....我...我.要...要要...要学....学学..学.编..编编.编.程.程.程.程";
        String s2=s.replaceAll("\\.+","");
        String s3=s2.replaceAll("(.)\\1+", "$1");  //$1代表第一组中的内容
        System.out.println(s3);
        
    }
    
}
输出:
我要学编程

正则表达式的获取功能

Pattern和Matcher概述

典型的调用顺序是
Pattern p=Pattern.compile("a*b"); //获取正则表达式
Matcher m=p.matcher("aaaaab"); //获取匹配器
boolean b=m.matches(); //看是否能匹配,匹配就返回true

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class test {
    public static void main(String[] args) {
        
        Pattern p=Pattern.compile("a*b");  //获取正则表达式
        Matcher m=p.matcher("aaaaab");     //获取匹配器
        boolean b=m.matches();      //看是否能匹配,匹配就返回true
        System.out.println(b);
        
        System.out.println("aaaaab".matches("a*b"));  //与上面的结果相同
        
        
    }
    
}
正则表达式的获取功能

Pattern和Matcher的结合使用
案例:
把一个字符串中的手机号码获取出来

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class test {
    public static void main(String[] args) {
        
        String str="我的手机号码是18640227648,我曾经用过13478179811,还用过18640227688.";
        String regex="1[3578]\\d{9}";   //手机号码的正则表达式
        Pattern p=Pattern.compile(regex);
        Matcher m=p.matcher(str);
        
        while(m.find())
            System.out.println(m.group());    
    }
    
}
输出:
18640227648
13478179811
18640227688
posted @ 2017-09-11 16:29  笨笨鸟  阅读(243)  评论(0编辑  收藏  举报