正则表达式

正则表达式

正则表达式:正则表达式是一个强大的字符串处理工具(是一个用于匹配字符串的模板),可以对字符串进行查找、提取、分割、替换等操作。

引入正则表达式

例:检验QQ号码的合法性

  • 未使用正则表达式
public class Demo01 {
    public static void main(String[] args) {
        /*校验QQ号码的合法性.
        1:必须是5-12位数字
        2:不能以0开头
        3:必须都是数字*/

        String QQ = "10001";
        //长度必须是5-12位
        if (QQ.length() >= 5 && QQ.length() <= 12) {
            //不能以0开头
            if (!QQ.startsWith("0")) {
                //必须都是数字
                for (int i = 0; i < QQ.length(); i++) {
                    char ch = QQ.charAt(i);
                    if (!(ch >= '0' && ch <= '9')) {
                        System.out.println("不合法字符:" + ch);
                    }
                }
            } else {
                System.out.println("QQ号不能以0开头");
            }
        } else {
            System.out.println("QQ号码长度不正确");
        }
    }
}
  • 使用正则表达式
public class RegexDemo01 {
    public static void main(String[] args) {
        String QQ="10001";
        String regex="[1-9]\\d{4,11}";
        boolean b = QQ.matches(regex);//返回的是一个boolean值
        System.out.println(b);//true
    }
}

正则表达式的构造摘要

  • 字符类
字符 说明
[abc] abc
[^abc] 任何字符,除了 abc(否定)
[a-zA-Z] azAZ,两头的字母包括在内(范围)
[a-d[m-p]] admp[a-dm-p](并集)
[a-z&&[def]] def(交集)
[a-z&&[^bc]] az,除了 bc[ad-z](减去)
[a-z&&[^m-p]] az,而非 mp[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]
  • Greedy 数量词
Greedy 数量词 说明
X? X,一次或一次也没有
X* X,零次或多次(只能含有X或者为空)
X+ X,一次或多次
X{n} X,恰好 n
X{n,} X,至少 n
X{n,m} X,至少 n 次,但是不超过 m

PS: 在Java中要多写 \(\b---\\b) 表转义

使用正则表达式

Pattern类和Matcher类

Pattern类:Pattern类用于创建一个正则表达式,也可以说创建一个匹配模式,它的构造方法是私有的,不可以直接创建,但可以通过Pattern.complie(String regex)简单工厂方法创建一个正则表达式,。

Matcher类:Matcher类是一个对字符序列执行各种匹配操作的引擎。Matcher对象是通过调用Pattern对象的方法matcher( )生成的。

Pattern对象是正则表达式编译后再内存中的表示形式,因此,正则表达式字符串必须先被编译为Pattern对象,在利用该Pattern对象调用matcher()方法创建对应的Matcher对象。执行匹配所涉及的状态保留在Matcher对象中,多个Matcher对象可以共享同一个Pattern对象。

典型的调用顺序是 :

//将一个字符串编译成Pattern对象
Pattern p = Pattern.compile("a*b");
//使用Pattern对象创建Matcher对象
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();//返回true

上面所定义的Pattern对象可以多次重复使用,若某一个正则表达式只需用一次,则可以直接使用Pattern类的静态方法matches()

boolean b=Pattern.matches("a*b","aaaaab");//返回true
Matcher类常用方法

find() 返回目标字符串中是否包含与Pattern匹配的子串

group() 返回与Pattern匹配的子串

例:提取字符串中所有的字母

public class MatcherTest {
    public static void main(String[] args) {
        String s="abc,Abc,12]w,?s2a,ab_c,<ab<c";
        Matcher m=Pattern.compile("[a-zA-Z]").matcher(s);
        while(m.find()){
            System.out.print(m.group());
        }
    }
}
输出结果:abcAbcwsaabcabc

正则表达式的分割方法

public String[] split(String regex) 返回为字符串数组

public class Split {
    public static void main(String[] args) {
        String s = "AA-CC-BB-DD-QQ";
        String[] arr = s.split("-");
        for(String str : arr){
            System.out.println(str);
        }
    }
}
AA
CC
BB
DD
QQ

PS:如果按"."分割的话,因为"."表示任何字符,所以注意添加转义字符"\\."

正则表达式的替换方法

public String replaceAll(String regex,String replacement)

public class ReplaceAll {
    public static void main(String[] args) {
        String s = "I LOVE U";
        //把"U"都改成"YOU"
        s = s.replaceAll("U", "YOU");
        System.out.println(s);
    }
}
I LOVE YOU
posted @ 2019-07-14 20:48  Jascen  阅读(550)  评论(0编辑  收藏  举报