Java的Pattern与Matcher类

Java的Pattern与Matcher类

(一)java.uti

java.util 是 java 实用工具类库,该类库提供了一些实用的工具类和数据结构。举个栗子,提供了日期(Data)类、日历(Calendar)类来产生和获取日期及时间;提供了随机数(Random)类产生各种类型的随机数;还提供了堆栈(Stack)、向量(Vector) 、位集合(Bitset)以及哈希表(Hashtable)等类来表示相应的数据结构。

(二)java 正则表达式

java.util 提供了正则表达式的工具类库:java.util.regex 。

1,第一个小栗子,匹配整个字符串

Pattern.matches(正则,待匹配的字符串) : 对整个待匹配的字符串进行匹配,只有整个字符串都匹配了才返回true。

正则 描述
\s 匹配空格
+ 匹配1次或多次,至少匹配1次
\s+ 匹配1个或多个空格,至少1个空格

\ :转义字符,例如"\n"匹配换行符。序列"\\"匹配"\","\("匹配"("。所以正则just\s+do\s+it\s+需要添加转义字符,结果为just\\s+do\\s+it\\s+

程序及结果:

    private static void firstExample(){
        String pattern = "just\\s+do\\s+it\\s+";
        String content1 = "just do it";
        String content11 = "just do it ";
        String content111 = "just   do     it   ";
        String content1111 = "Please just   do     it  !";
        boolean result1 = Pattern.matches(pattern, content1);  //返回false
        boolean result11 = Pattern.matches(pattern, content11);  //返回true
        boolean result111 = Pattern.matches(pattern, content111); //返回true
        boolean result1111 = Pattern.matches(pattern, content1111); //返回false
        System.out.println(result1+"-"+result11+"-"+result111+"-"+result1111); //返回false-true-true-false
    }

2,第二个小栗子,匹配字符串是否包含符合正则的子字符串

pattern():返回正则,使用时还需要添加上转义字符。
find():判断匹配结果,匹配成功返回true,否则返回false
group():返回匹配到的子字符串。在调用该方法前必须先调用Matcher.find()方法,否则报错 No match found。

    private static void secondExample(){
        Pattern p0= Pattern.compile("just\\s+do\\s+it\\s+");
        System.out.println(p0.pattern()); //返回 just\s+do\s+it\s+
        Pattern p= Pattern.compile("\\d+");
        Matcher m1=p.matcher("5,55 are good numbers,666");
        System.out.println(m1.find());   //返回true
        System.out.println(m1.group());   //返回5
        System.out.println(m1.group());   //返回5
    }

group()返回第一次匹配到的子字符串,要通过遍历才能返回每次匹配到的子字符串:

    private static void thirdExample(){
        Pattern p= Pattern.compile("\\d+");
        Matcher m1=p.matcher("5,55 are good numbers,666");
        while(m1.find()) {
            // System.out.println(m1.group(0)); 这种写法也可以
            System.out.println(m1.group());  //返回5  55 666
        }
    }

3,第三个小栗子:matcher.group(int group); 与 matcher.groupCount();

matcher.group(int group); 与 matcher.groupCount();
是用在pattern中有‘()’时使用。

如下栗子,整个完整的正则是"(\d+)([\sa-z]+)",该正则又由两个子正则"(\d+)"和"([\sa-z]+)"组成。

  • groupCount()表示子正则的个数
  • group(0)表示完整正则的匹配结果。
  • 第一组子正则"(\d+)"用于匹配数字,匹配结果为group(1);
  • 第二组子正则"([\sa-z]+)"用于匹配空格和小写字母的组合,匹配结果为group(2)。

代码和运行结果如下:

    private static void fouthExample(){
        Matcher matcher = Pattern.compile("(\\d+)([\\sa-z]+)").matcher("666 is greate number");
        matcher.find(); // 此方法不可省略        System.out.println(matcher.groupCount()); //2
        System.out.println(matcher.group(0)); // "666 is greate number"
        System.out.println(matcher.group(1)); // "666"
        System.out.println(matcher.group(2)); // " is greate number"
//        System.out.println(matcher.group(3)); // IndexOutOfBoundsException
    }

如果正则表达式中没有'()',那么就是匹配整个正则,所以匹配结果可以写成group(0),即第二个栗子中System.out.println(m1.group());也可以写成System.out.println(m1.group(0));

4,java.util.regex 核心的三个类讲解

1)Pattern 类

Pattern 类没有公共构造方法,所以我们不能通过new Pattern()方式创建Pattern 对象。但是我们可以调用其公共静态编译方法compile来创建对象,就如上面栗子中那样写的一般。

compile方法源码:

    public static Pattern compile(String regex) {
        return new Pattern(regex, 0);
    }

继续查看new Pattern(regex, 0);的源码:

private Pattern(String p, int f) {
  ...
}

因此,Pattern 类的构造方法是private的,外部无法直接调用。而该构造方法对内部可见,所以通过public的compile方法去间接调用该构造方法创建Pattern对象。这点原理与类成员属性设置为private级别,同时暴露出getter、setter方法的通道让外部可以访问类成员属性是一样的。

2)Matcher 类

Matcher 对象作用是对输入字符串进行正则匹配。Matcher 也没有公共构造方法,需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。

3)PatternSyntaxException 类

PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。

(三)java 强制性异常和非强制性异常

java中的异常分为两大类:

  • 强制性异常
    必须try catch 或者throws处理的异常。
  • 非强制性异常
    可以try catch或者thows处理的异常,也可以不做异常处理。所以我们在上面的栗子中可以不对PatternSyntaxException进行异常处理。

java中除了RuntimeException外,都是强制性异常。

(四)栗子完整代码

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

public class PatternAndMatcher {

    public static void main(String[] args){
//        firstExample();
//        secondExample();
        thirdExample();
    }

    private static void firstExample(){
        String pattern = "just\\s+do\\s+it\\s+";
        String content1 = "just do it";
        String content11 = "just do it ";
        String content111 = "just   do     it   ";
        String content1111 = "Please just   do     it  !";
        boolean result1 = Pattern.matches(pattern, content1);  //返回false
        boolean result11 = Pattern.matches(pattern, content11);  //返回true
        boolean result111 = Pattern.matches(pattern, content111); //返回true
        boolean result1111 = Pattern.matches(pattern, content1111); //返回false
        System.out.println(result1+"-"+result11+"-"+result111+"-"+result1111); //返回false-true-true-false
    }

    private static void secondExample(){
        Pattern p0= Pattern.compile("just\\s+do\\s+it\\s+");
        System.out.println(p0.pattern()); //返回 just\s+do\s+it\s+
        Pattern p= Pattern.compile("\\d+");
        Matcher m1=p.matcher("5,55 are good numbers,666");
        System.out.println(m1.find());   //返回true
        System.out.println(m1.group());   //返回5
        System.out.println(m1.group());   //返回5
    }

    private static void thirdExample(){
        Pattern p= Pattern.compile("\\d+");
        Matcher m1=p.matcher("5,55 are good numbers,666");
        while(m1.find()) {
            System.out.println(m1.group());  //返回5  55 666
        }
    }

    private static void fouthExample(){
        Matcher matcher = Pattern.compile("(\\d+)([\\sa-z]+)").matcher("666 is greate number");
        matcher.find(); // 此方法不可省略        
        System.out.println(matcher.groupCount()); //2
        System.out.println(matcher.group(0)); // "666 is greate number"
        System.out.println(matcher.group(1)); // "666"
        System.out.println(matcher.group(2)); // " is greate number"
//        System.out.println(matcher.group(3)); // IndexOutOfBoundsException
   }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351

推荐阅读更多精彩内容

  • 一、Java 简介 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计...
    子非鱼_t_阅读 4,172评论 1 44
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,642评论 18 139
  • 12月某天的下午,身体钻出温热如你的体温的被窝,伴着窗外婆娑小雨,体育场里,学院健儿们热情似火的呐喊,渗透到图书馆...
    Ruby_于杨阅读 403评论 2 1
  • 四年时光,匆匆而过。 那年,我们每天准时上下课,按时吃饭休息,还处在高中与大学的过渡期,彷彷惶惶,唯唯诺诺。 那年...
    落幕青春阅读 186评论 0 1
  • 近日,陕西省榆林市一院,一名临盆产妇跳楼自杀,院方和家属各执一词,各大媒体纷纷跟进报道,网络水军猛烈开喷。...
    刘轶群阅读 295评论 0 3