第五章 Java API(九)

5.6正则表达式
5.6.1元字符

正则表达式是由普通字符(如字符a -z)和特殊字符(元字符)组成的文字模式。元字符是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。

表5-15 常见的正则表达式元字符

元字符

功能描述

转义字符,例如"\n"匹配"\n"

正则表达式的开头标志

正则表达式的结尾标志

匹配零次或多次

+

匹配一次或多次

匹配一次或零次

.

匹配任意字符

{n}

匹配n次

{n.}

至少匹配n次

{n.m} 

n<=m,最少匹配n次,最多匹配m次

x|y| 

匹配x或者y

【xyz】

字符集合,匹配所包含的任意一个字符

【a-z】

字符范围,匹配指定范围内的任意字符

【^a-z】

负值字符范围,匹配任何不在指定范围内的任意字符

【a-zA-Z】 

匹配a~z到A~Z

\d 

匹配数字1-9

\D

匹配非数字字符

\s

匹配空白字符

\S

匹配非空白字符

\w

匹配单词字符与数字0~9

\b 

单词边界

\B

非单词边界

\A 

输入的开头

\G

上一个匹配的结尾

\Z

输入的结尾,仅用于最后的结束符(如果有的话)

\z

输入的内容

\b 

单词边界


   5.6.2  Pattern类和Matcher类

Java正则表达式通过java.util.regex包下的Pattern类和Matcher类实现,所以要想使用正则表达式,首先要学会这两个类的使用方法,下面分别对这两个类进行详细讲解。

1.Pattern类

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

Pattern p=Pattern.compile("\\w+");

 Pattern在正则表达式的应用比较广泛,所以灵活使用Pattern类是非常重要的。

表5.16 Pattern类的常用方法

方法声明 功能描述
split(CharSequence input)将给定的输入序列分成这个模式的匹配
Matcher matcher(CharSequence input)提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持
Static boolean matches (String regex,CharSequence input) 翻译给定的正则表达式,并尝试匹配给定的输入

案例学习 5-28

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example28 {
    public static void main(String[] args) {
        Pattern p=Pattern.compile("\\d+");
        String[] str=p.split("我的QQ是:456456我的电话是:0532214我的邮箱是:aaa@aaa.com");
        System.out.println("是否匹配Pattern的输入模式"+
        Pattern.matches("\\d+","2223"));
        System.out.println("是否匹配Pattern的输入模式"+ 
        Pattern.matches("\\d+","2223aa"));
        Matcher m=p.matcher("22bb23");
        System.out.println("返回该Matcher对象是由哪个Pattern对象创建的,即p为:"+m.pattern());
        System.out.print("将给定的字符串分割成Pattern模式匹配为:");
        for (int i=0;i<str.length;i++) {
            System.out.print(str[i]+ "  ");
        }
    }
}

运行结果→

是否匹配Pattern的输入模式true
是否匹配Pattern的输入模式false
返回该Matcher对象是由哪个Pattern对象创建的,即p为:\d+
将给定的字符串分割为Pattern模式匹配为:我的QQ是:456456我的电话是:0532214我的邮箱是:aaa@aaa. com

2.Matcher类

Matcher类用于在给定的Pattern实例的模式控制下进行字符串的匹配工作,同理,Matcher的构造方法也是私有的,不能直接创建,只能通过Pattern matcher(CharSequence input)方法得到该类的实例。下面介绍Matcher类的常用方法。

表5-17 Matcher类的常用方法

方法声明功能描述
boolean Matches()对整个字符串进行匹配,只有整个字符串都匹配才返回true
boolean lookingAt() 对前面的字符串进行匹配,只有匹配到的字符串在最前面才返回true
boolean find()对字符串进行匹配,匹配到的字符串可以在任何位置
int end()返回最后一个字符匹配后的偏移量
string group()返回匹配到的子字符串
int start()返回匹配到的子字符串在字符串中的索引位置

案例学习 5-29   
 

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example29 {
    public static void main(String[] args) {
        Pattern p=Pattern.compile("\\d+");
        Matcher m=p.matcher("22bb23");
        System.out.println("字符串是否匹配:"+ m.matches());  
        Matcher m2=p.matcher("2223");
        System.out.println("字符串是否匹配:"+ m2.matches());
        System.out.println("对前面的字符串匹配结果为"+ m.lookingAt());
        Matcher m3=p.matcher("aa2223");
        System.out.println("对前面的字符串匹配结果为:"+m3.lookingAt());
        m.find();//返回true
        System.out.println("字符串任何位置是否匹配:"+ m.find());
        m3.find();//返回true
        System.out.println("字符串任何位置是否匹配:"+ m3.find());
        Matcher m4=p.matcher("aabb");
        System.out.println("字符串任何位置是否匹配:"+ m4.find());
        Matcher m1=p.matcher("aaa2223bb");
        m1.find();//匹配2223
        System.out.println("上一个匹配的起始索引::"+  m1.start());
        System.out.println("最后一个字符匹配后的偏移量"+  m1.end());
        System.out.println("匹配到的子字符串:"+  m1.group());
    }
}

运行结果→

字符串是否匹配:false 
字符串是否匹配: true 
对前面的字符串匹配结果为: true
对前面的字符串匹配结果为:false
字符串任何位置是否匹配:false
字符串任何位置是否匹配:false

字符串任何位置是否匹配:false

上一个匹配的起始索引:3
最后一个字符匹配后的偏移量:7
匹配到的子字符串:2223 

5.6.3 String类对正则表达式的支持

 String类提供了3个方法支持正则操作。如下:

表5-18 String类支持正则操作的方法

方法声明功能描述
boolean matches(String regex)匹配字符串
String replaceAll(String regex,String replaceAll) 字符串替换
String[]split(String regex) 字符串拆分

案例学习   5-30

public class Example30{
    public static void main(String[] args) {
        String str = "A1B22DDS34DSJ9D".replaceAll("\\d+","_");
        System.out.println("字符替换后为:"+str);
        boolean te = "321123as1".matches("\\d+");
        System.out.println("字符串是否匹配:"+te);
        String s [] ="SDS45d4DD4dDS88D".split("\\d+");
        System.out.print("字符串拆分后为:");
        for(int i=0;i<s.length;i++){
            System.out.print(s[i]+"  ");
        }
    }
}

 运行结果→

字符替换后为: A_B_DDS_ DSJ_D
 字符串是否匹配: false
 字符串拆分后为: SDS d DD dDs D

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值