Pattern.asMatchPredicate 和 Pattern.asPredicate 之间的区别

Difference between Pattern.asMatchPredicate and Pattern.asPredicate

Java 11 在Pattern class(正则表达式的编译版本)中添加了一些新方法,包括:

我想了解两者之间的区别,以及我什么时候想使用其中之一?

    如果 输入字符串的任何部分 与正则表达式匹配,
  • Pattern.asPredicate 将 return 为真。如果您要针对特定​​模式测试较大的文本主体,则应使用此方法。例如,测试用户的评论是否包含超链接。
  • 如果 整个输入字符串 与正则表达式匹配,
  • Pattern.asMatchPredicate 将 return 为真。如果您正在测试特定模式的整个输入,则应该使用此方法。例如,验证用户个人资料中的 phone 号码。

Pattern.asPredicate 内部使用 Matcher.find(), while Pattern.asMatchPrediate internally uses Matcher.matches()。所以两者的区别从Matcherclass.

归结为这两种方法的区别

下面是一些展示差异的示例。您可以将下面的代码复制并粘贴到像 https://www.compilejava.net/ 这样的在线 Java 沙箱中,以便自己尝试。

import java.util.regex.Pattern;
import java.util.function.Predicate;

public class main
{
    public static void main(String[] args) {
        Pattern pattern = Pattern.compile("abc");

        // asPredicate will match any part of the input string
        Predicate<String> asPredicate = pattern.asPredicate();
        
        // True, because abc is part of abc
        System.out.printf("asPredicate: abc: %s\n", asPredicate.test("abc"));

        // True, because abc is part of abcabc
        System.out.printf("asPredicate: abcabc: %s\n", asPredicate.test("abcabc"));

        // True, because abc is part of 123abc123
        System.out.printf("asPredicate: 123abc123: %s\n", asPredicate.test("123abc123"));

        // False, because abc is NOT part of 123
        System.out.printf("asPredicate: 123: %s\n", asPredicate.test("123")); // -> false

        // asMatchPredicate will only match the entire input string
        Predicate<String> asMatchPredicate = pattern.asMatchPredicate();

        // True, because abc exactly matches abc
        System.out.printf("asMatchPredicate: abc: %s\n", asMatchPredicate.test("abc"));

        // False, because abc does not exactly match abcabc
        System.out.printf("asMatchPredicate: abcabc: %s\n", asMatchPredicate.test("abcabc"));

        // False, because abc does not exactly match 123abc123
        System.out.printf("asMatchPredicate: 123abc123: %s\n", asMatchPredicate.test("123abc123"));

        // False, because abc does not exactly match 123
        System.out.printf("asMatchPredicate: 123: %s\n", asMatchPredicate.test("123"));
    }
}