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()
。所以两者的区别从Matcher
class.
归结为这两种方法的区别
下面是一些展示差异的示例。您可以将下面的代码复制并粘贴到像 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"));
}
}
Java 11 在Pattern
class(正则表达式的编译版本)中添加了一些新方法,包括:
我想了解两者之间的区别,以及我什么时候想使用其中之一?
-
如果 输入字符串的任何部分 与正则表达式匹配,
Pattern.asPredicate
将 return 为真。如果您要针对特定模式测试较大的文本主体,则应使用此方法。例如,测试用户的评论是否包含超链接。
如果 整个输入字符串 与正则表达式匹配,Pattern.asMatchPredicate
将 return 为真。如果您正在测试特定模式的整个输入,则应该使用此方法。例如,验证用户个人资料中的 phone 号码。
Pattern.asPredicate
内部使用 Matcher.find()
, while Pattern.asMatchPrediate
internally uses Matcher.matches()
。所以两者的区别从Matcher
class.
下面是一些展示差异的示例。您可以将下面的代码复制并粘贴到像 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"));
}
}