正则表达式应用

提取车牌最后1个数字

项目需求是这样的:需要提取车牌号中最后一个数字,比如说:苏A7865提取5,苏A876X提取6

实现方法:

    /**
     * 从车牌中提取信息最后一个数字
     */
    @Test
    public void extractPlate() {
        String s = "A876X";
        // 把要匹配的字符串写成正则表达式,然后要提取的字符使用括号括起来
        // 在这里,我们要提取最后一个数字,正则规则就是"一个数字加上大于等于0个非数字再加上结束符"
        Pattern pattern = Pattern.compile("(\\d)[^\\d]*$");
        Matcher matcher = pattern.matcher(s);
        if (matcher.find()) {
            System.out.println(matcher.group(1));
        }
    }

正则表达式多组分组

关于Matcher 中的几个方法说明:

Mathcer.start() / Matcher.end() / Matcher.group() 当使用matches(), lookingAt(), find() 执行匹配操作后,就可以利用以上三个方法得到更详细的信息.

  • start() 返回匹配到的子字符串在字符串中的索引位置.
  • end() 返回匹配到的子字符串的最后一个字符在字符串中的索引位置.
  • group() 返回匹配到的子字符串
  • matches() 匹配字串所有字符串, 整个字符串匹配不上时报java.lang.IllegalStateException: No match available
  • lookingAt() 匹配字串前面的字符串,前面的字符串匹配不上时,报java.lang.IllegalStateException: No match available
  • find() 匹配能找到的子串,只要有1个匹配到就可以了

代码示例:

    /**
     * 正则表达式常用方法测试
     * <br/>
     * `start()` 返回匹配到的子字符串在字符串中的索引位置.
     * `end()` 返回匹配到的子字符串的最后一个字符在字符串中的索引位置.
     * `group()` 返回匹配到的子字符串
     */
    @Test
    public void regLooking() {
        System.out.println("第1组");
        Pattern p = Pattern.compile("\\d+");
        Matcher m = p.matcher("aaa2223bb");
        // find() 匹配能找到的子串
        // 匹配2223, 返回true
        // 这1步一定要执行,否则报 java.lang.IllegalStateException: No match available
        System.out.println(m.find());
        // 返回3
        System.out.println(m.start());
        // 返回7,返回的是2223后的索引号
        System.out.println(m.end());
        // 返回2223,等同于第0组
        System.out.println(m.group());
        // 返回2223
        System.out.println(m.group(0));

        System.out.println("第2组");
        Matcher m2 = p.matcher("2223bb");
        // lookingAt()只能匹配前面的字符串
        // 如果 输入为 aaa2223bb ,报java.lang.IllegalStateException: No match available
        // 匹配2223 返回true。
        System.out.println(m2.lookingAt());
        // 返回0
        System.out.println(m2.start());
        // 返回4
        System.out.println(m2.end());
        // 返回2223,等同于第0组
        System.out.println(m2.group());
        // 返回2223
        System.out.println(m2.group(0));

        System.out.println("第3组");
        Matcher m3 = p.matcher("2223");
        // matches() 匹配所有字符串
        // 如果输入为 2223bb ,m3.matches()出错,因为不匹配返回false
        System.out.println(m3.matches());
        // 返回0
        System.out.println(m3.start());
        // 返回3
        System.out.println(m3.end());
        // 返回2223,等同于第0组
        System.out.println(m3.group());
        // 返回2223
        System.out.println(m3.group(0));
    }

start(),end(),group()均有一个重载方法它们是start(int i),end(int i),group(int i)专用于分组操作,

Mathcer类还有一个groupCount()用于返回有多少组.

如果有多次匹配,find() 可以向后查找多次

    /**
     * 正则表达式多组分组测试
     */
    @Test
    public void regMultiGroup() {
        Pattern p = Pattern.compile("([a-z]+)(\\d+)");
        //输入 aa2a2bb223bb, 第一次find()会匹配到 aa2,后面可以多次find()
        Matcher m = p.matcher("aaa2223bb");
        // 匹配aaa2223
        System.out.println(m.find());
        // 返回2,因为有2组
        System.out.println("组数:" + m.groupCount());
        // 返回0 返回第1组匹配到的子字符串在字符串中的索引号
        System.out.println(m.start(1));
        // 返回3 返回第2组匹配到的子字符串在字符串中的索引号
        System.out.println(m.start(2));
        // 返回3 返回第1组匹配到的子字符串的最后一个字符在字符串中的索引位置.
        System.out.println(m.end(1));
        // 返回7 返回第2组匹配到的子字符串的最后一个字符在字符串中的索引位置.
        System.out.println(m.end(2));
        // 返回aaa,返回第1组匹配到的子字符串
        System.out.println("第1组匹配到的子字符串:" + m.group(1));
        // 返回2223,返回第2组匹配到的子字符串
        System.out.println("第2组匹配到的子字符串:" + m.group(2));
    }

提取QQ信息

有一段文本,里面有很多数字,而且这些数字是分开的,我们现在要将文本中所有数字都取出来,利用java的正则操作是那么的简单.

    /**
     * 提取QQ信息
     * 输出
     * 组数:0
     * 匹配次数1
     * 456456
     * start:6 end:12
     * 匹配次数2
     * 0532214
     * start:19 end:26
     * 匹配次数3
     * 123
     * start:36 end:39
     */
    @Test
    public void extractQQ() {
        Pattern p = Pattern.compile("\\d+");
        Matcher m = p.matcher("我的QQ是:456456 我的电话是:0532214 我的邮箱是:aaa123@aaa.com");
        System.out.println("组数:" + m.groupCount());
        int i = 1;
        while (m.find()) {
            System.out.println("匹配次数" + (i++));
            System.out.println(m.group());
            System.out.print("start:" + m.start());
            System.out.println(" end:" + m.end());
        }
    }

每次执行匹配操作后start(), end(), group() 三个方法的值都会改变,改变成匹配到的子字符串的信息,以及它们的重载方法,也会改变成相应的信息.

注意: 只有当匹配操作成功,才可以使用start(),end(),group()三个方法,否则会抛出java.lang.IllegalStateException,也就是当matches(),lookingAt(),find()其中任意一个方法返回true时,才可以使用。

参考

  1. Java正则表达式提取字符的方法实例

results matching ""

    No results matching ""