Java的正则相关的Pattern和Matcher

31次阅读

共计 2186 个字符,预计需要花费 6 分钟才能阅读完成。

Java 的正则相关的 Pattern 和 Matcher

此篇文章是记录我在学习 Java 正则表达式时候学到的和遇到的坑。

先来说说 Matcher 里面的三个方法(取的结果以 group()方法为例子)

  • matches(): 整个匹配,只有整个字符序列完全匹配成功,才返回 True,否则返回 False。但如果前部分匹配成功,将移动下次匹配的位置。举个例子如果字符串为 ”a123″, 正则表达式为 ”\w\d\d\d”,则 matches()方法才返回 true,换言之,就是要匹配的字符串需要跟正则表达式一一对应,字母对应字母,数字对应数字,所以称之为完全匹配,错一位都不行。(这里的理解花了我好长时间,网上搜到的都没有提及,也许是我理解能力不够)
  • find(): 部分匹配,从当前位置开始匹配,找到一个匹配的子串,将移动下次匹配的位置。“find()像迭代器那样向前遍历输入字符串。”– 摘自《Java 编程思想。看下面的例子中的 find()方法,要匹配的字符串为 ”a123b”,正则表达式为 ”\d\d\d”,而最后输出结果为:123,所以称之为部分匹配,只要有,就返回 true。
  • lookingAt(): 部分匹配,总是从第一个字符进行匹配, 匹配成功了不再继续匹配,匹配失败了, 也不继续匹配。lookingAt()方法介于 matches()和 find()方法之间。lookingAt()方法的部分匹配指从第一位开始匹配如果第一位没有匹配到,就不再匹配,直接返回 false,如果第一位匹配到了,则匹配第二位,以此类推。例子:要匹配的字符串为 ”a123b”,正则表达式为 ”\w\d\d”,输出结果为 ”a12″,很好理解,就是一位一位地匹配,匹配到了就匹配下一位。”\w\d\d” 这个正则正好代表 ” 字母数字数字 ”,所以正好输出结果为 a12。

好了上测试代码:

package com.wjj.utils;

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

/**
* @author 作者 : 榨菜哥
* @version 创建时间:2016 年 8 月 18 日 上午 8:47:58
* 类说明:正则表达式的练习
*/
public class Regex {

    //find 方法测试
    public static void find(String html) {
        String regex = "\\d\\d\\d";
        Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(html);
        System.out.print("find():");
        if (matcher.find()) {System.out.println(matcher.group());
        }
        
    }
    //matches 方法测试
    public static void matches(String html) {
        String regex = "^\\w\\d\\d\\d";
        Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(html);
        System.out.print("matches():");
        if (matcher.matches()) {System.out.println(matcher.group());
        }
        
    }
    //lookingAt 方法测试
    public static void lookingAt(String html) {
        String regex = "\\w\\d\\d";
        Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(html);
        System.out.print("lookingAt():");
        if (matcher.lookingAt()) {System.out.println(matcher.group());
        }
        
    }
    
    public static void main(String[] args) {
        //find 方法测试
        find("a123b");
        //matches 方法测试
        matches("a123");
        //lookingAt 方法测试
        lookingAt("a123b");
    }
}

输出结果:find():123
    matches():a123
    lookingAt():a12

小结:正则表达式本身并不难,平常使用的时候只要按照规则来写就好了。在学习中理解 matches、find、和 lookingAt 三个方法花了我比较长的时间,一直不能理解完全匹配和部分匹配是什么意思,最后还是在 stackoverflow 上找到了想要的答案。

以上是个人学习的理解,有不对之处,希望给予指点。
(补充:正则表达式 Pattern 如果调用多次容易出问题,比如内存溢出,因为 Pattern 每执行一次就编译一次正则表达式,因此建议将需要的正则表达式进行预编译。)
正则表达式学习教程:http://deerchao.net/tutorials/regex/regex.htm,文中作者写得挺详细的,并且通俗易懂。

正文完
 0