Java中Pattern类的asMatchPredicate与asPredicate方法有什么区别
Java 11 Pattern类两个Predicate方法差异及使用场景
两个方法均返回Predicate<String>类型,核心差异仅在于匹配逻辑不同:
asPredicate():判断输入字符串是否包含正则规则的匹配片段,底层等价于Pattern.matcher(input).find()asMatchPredicate():判断输入字符串整体是否完全符合正则规则,底层等价于Pattern.matcher(input).matches()
直观示例
假设我们编译正则匹配3位连续数字:Pattern p = Pattern.compile("\\d{3}");
不同输入的匹配结果如下:
| 输入字符串 | asPredicate()返回结果 | asMatchPredicate()返回结果 |
|---|---|---|
| "123" | true | true |
| "abc123def" | true | false |
| "1234" | true | false |
| "abc" | false | false |
适用场景
asPredicate()适用场景
- 批量过滤包含指定特征的内容,比如从日志列表中筛选包含指定错误码的日志行
- 文本命中检测,比如检查用户输入内容是否包含敏感词、指定关键词
asMatchPredicate()适用场景
- 格式合法性校验,比如校验用户输入的手机号、邮箱、身份证号是否完全符合规范
- 批量筛选完全符合格式要求的字符串,比如从一堆文本中过滤出所有纯3位数字的内容
代码演示
import java.util.regex.Pattern; import java.util.List; public class PatternPredicateDemo { public static void main(String[] args) { Pattern threeNumPattern = Pattern.compile("\\d{3}"); List<String> testList = List.of("123", "a123b", "1234", "test"); // 过滤所有包含3位连续数字的字符串 System.out.println("asPredicate匹配结果:"); testList.stream() .filter(threeNumPattern.asPredicate()) .forEach(System.out::println); // 输出:123、a123b、1234 // 过滤所有整体是3位数字的字符串 System.out.println("asMatchPredicate匹配结果:"); testList.stream() .filter(threeNumPattern.asMatchPredicate()) .forEach(System.out::println); // 输出:123 } }
内容的提问来源于stack exchange,提问作者Martin Devillers
相关产品推荐
相关产品推荐

