正则表达式,两种方法结果不同

//        String pattern = "[\\u4E00-\\u9FA5]+";
        String pattern = "[\\u4E00-\\u9FFF]+";
String scope = "120万吨";
//第一种
        Pattern p = Pattern.compile(pattern);
        if(p.matcher(scope).find()) {
            System.out.println("2" + scope);
        }else {
            System.out.println("3" + scope);
        }
//第二种
        if(Pattern.matches(pattern, scope)) {
            System.out.println("4" + scope);
        }else {
            System.out.println("5" + scope);
        }

这两种方法有什么区别?为什么结果不一样。

援引GPT回答:
这两种方法的区别在于匹配的方式和返回结果。

第一种方法使用Pattern类的matcher方法来进行匹配,返回一个Matcher对象。Matcher对象有find()方法,用于判断是否能找到匹配的子序列。如果能找到,则返回true,否则返回false。

第二种方法使用Pattern类的matches方法来进行匹配,直接返回一个布尔值。matches方法会尝试将整个输入序列与正则表达式进行匹配,只有当整个序列完全匹配才会返回true,否则返回false。

在这个例子中,第一种方法使用的是find()方法,只要在输入序列中找到任何一个匹配的子序列,就会返回true。而第二种方法使用的是matches()方法,要求整个输入序列完全匹配正则表达式才会返回true。

根据你提供的例子,使用第一种方法会返回"2" + scope,表示找到了匹配的子序列。而使用第二种方法会返回"5" + scope,表示没有找到完全匹配的子序列。

原因是因为你的正则表达式"[\u4E00-\u9FFF]+"表示匹配一个或多个汉字,而输入序列"120万吨"中包含了数字和汉字,不是一个完全匹配的子序列。所以第二种方法返回false。而第一种方法使用的是find()方法,只要找到了一个或多个汉字,就会返回true,所以第一种方法返回true。