ZetCode

Java Pattern.matches 方法

上次修改时间:2025 年 4 月 20 日

Pattern.matches 方法是 Java 正则表达式 API 中的一个静态实用程序。 它提供了一种快速的方法来检查字符串是否与正则表达式模式匹配。 该方法一步完成模式的编译和与输入的匹配。

此方法适用于简单的一次性模式匹配操作。 对于重复匹配,单独编译模式更有效。 如果整个输入序列与模式匹配,该方法返回 true。

Pattern.matches 方法概述

Pattern.matches 方法具有以下签名:public static boolean matches(String regex, CharSequence input)。 它接受一个正则表达式模式和一个输入字符串,并返回一个布尔值结果。

在内部,它编译模式并为输入创建一个匹配器。 该方法等效于 Pattern.compile(regex).matcher(input).matches。 如果正则表达式语法无效,它会抛出 PatternSyntaxException。

基本模式匹配示例

此示例演示了 Pattern.matches 的最简单用法。 我们检查字符串是否与基本模式匹配。 该模式使用文字字符,不包含特殊的正则表达式构造。

BasicMatch.java
package com.zetcode;

import java.util.regex.Pattern;

public class BasicMatch {

    public static void main(String[] args) {
        
        String input = "Hello World";
        String regex = "Hello World";
        
        boolean isMatch = Pattern.matches(regex, input);
        System.out.println("Exact match: " + isMatch);
        
        regex = "Hello.*";
        isMatch = Pattern.matches(regex, input);
        System.out.println("Pattern match: " + isMatch);
    }
}

第一个检查验证输入和模式之间的精确匹配。 第二个使用 .* 正则表达式构造来匹配 "Hello" 之后的任何字符。 在此示例中,两种模式都与输入字符串匹配。

电子邮件验证示例

此示例展示了如何使用 Pattern.matches 验证电子邮件地址。 正则表达式模式遵循常见的电子邮件验证规则,同时保持简单。

EmailValidation.java
package com.zetcode;

import java.util.regex.Pattern;

public class EmailValidation {

    public static void main(String[] args) {
        
        String[] emails = {
            "user@example.com",
            "first.last@domain.co",
            "invalid.email@",
            "missing@tld",
            "name@123.123.123.123"
        };
        
        String regex = "^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+$";
        
        for (String email : emails) {
            boolean isValid = Pattern.matches(regex, email);
            System.out.printf("%-25s: %s%n", email, isValid);
        }
    }
}

正则表达式模式检查 @ 符号之前的字母数字字符。 在 @ 之后,它需要一个至少包含一个点的域名。 这是一种基本验证,可以捕获明显的错误,但可能会允许一些无效的地址。

电话号码验证示例

此示例演示了使用不同格式的电话号码验证。 该模式适用于可选的国家/地区代码和各种分隔符。

PhoneValidation.java
package com.zetcode;

import java.util.regex.Pattern;

public class PhoneValidation {

    public static void main(String[] args) {
        
        String[] phones = {
            "+1 (123) 456-7890",
            "123.456.7890",
            "123-456-7890",
            "(123)4567890",
            "1234567890",
            "123-45-6789"
        };
        
        String regex = "^\\+?\\d{1,3}?[-.\\s]?\\(?\\d{3}\\)?[-.\\s]?\\d{3}[-.\\s]?\\d{4}$";
        
        for (String phone : phones) {
            boolean isValid = Pattern.matches(regex, phone);
            System.out.printf("%-20s: %s%n", phone, isValid);
        }
    }
}

正则表达式模式很复杂但很灵活。 它处理可选的国家/地区代码、区号周围的括号以及各种分隔符。 最后一个测试用例显示了一个无效的社会安全号码模式,验证失败。

日期格式验证示例

此示例使用 Pattern.matches 验证不同格式的日期。 该模式检查常见的日期格式,同时确保有效的日/月值。

DateValidation.java
package com.zetcode;

import java.util.regex.Pattern;

public class DateValidation {

    public static void main(String[] args) {
        
        String[] dates = {
            "2023-12-31",
            "12/31/2023",
            "31-12-2023",
            "2023/12/31",
            "02-29-2023", // Invalid (not a leap year)
            "13-01-2023"  // Invalid month
        };
        
        String regex = "^(?:(?:19|20)\\d\\d)[-/](?:(?:0[1-9]|1[0-2])[-/](?:0[1-9]|[12][0-9]|3[01])|(?:0[1-9]|[12][0-9]|3[01])[-/](?:0[1-9]|1[0-2]))$";
        
        for (String date : dates) {
            boolean isValid = Pattern.matches(regex, date);
            System.out.printf("%-15s: %s%n", date, isValid);
        }
    }
}

正则表达式模式验证 YYYY-MM-DD、MM/DD/YYYY 和 DD-MM-YYYY 格式的日期。 它检查有效的月份 (1-12) 和日期 (1-31),但不验证所有日历规则(例如闰年中的二月天数)。

密码强度检查示例

此示例使用多个带有 Pattern.matches 的正则表达式模式检查密码强度。 每个模式测试不同的复杂性要求。

PasswordStrength.java
package com.zetcode;

import java.util.regex.Pattern;

public class PasswordStrength {

    public static void main(String[] args) {
        
        String[] passwords = {
            "weak",
            "Better1",
            "Str0ngP@ss",
            "NoNumbers!",
            "LongEnoughButNoSpecialChars123"
        };
        
        // At least 8 chars, one uppercase, one lowercase, one digit
        String mediumRegex = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d).{8,}$";
        
        // Medium requirements plus one special character
        String strongRegex = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&]).{8,}$";
        
        for (String pwd : passwords) {
            boolean isMedium = Pattern.matches(mediumRegex, pwd);
            boolean isStrong = Pattern.matches(strongRegex, pwd);
            
            String strength;
            if (isStrong) strength = "Strong";
            else if (isMedium) strength = "Medium";
            else strength = "Weak";
            
            System.out.printf("%-30s: %s%n", pwd, strength);
        }
    }
}

该示例使用正向预查 ((?=...)) 来检查字符类要求,而无需消耗输入。 中等模式需要长度、大小写和数字规则。 强模式添加了特殊字符要求。

URL 验证示例

此示例使用 Pattern.matches 验证具有不同协议和格式的 URL。 该模式检查有效的 URL 结构。

UrlValidation.java
package com.zetcode;

import java.util.regex.Pattern;

public class UrlValidation {

    public static void main(String[] args) {
        
        String[] urls = {
            "https://www.example.com",
            "https://:8080",
            "ftp://files.example.org",
            "www.missing.protocol.com",
            "https://example.com/path?query=param",
            "invalid url"
        };
        
        String regex = "^(https?|ftp)://[\\w\\-]+(\\.[\\w\\-]+)+([\\w\\-.,@?^=%&:/~+#]*[\\w\\-@?^=%&/~+#])?$";
        
        for (String url : urls) {
            boolean isValid = Pattern.matches(regex, url);
            System.out.printf("%-35s: %s%n", url, isValid);
        }
    }
}

该正则表达式验证具有 http、https 或 ftp 协议的 URL。 它需要一个至少包含一个点的域名,并允许可选的路径、查询和片段。 该模式拒绝没有协议和格式错误的域名的 URL。

信用卡验证示例

此示例使用 Pattern.matches 以及不同卡类型的模式来验证信用卡号码。 它检查格式并执行 Luhn 校验。

CreditCardValidation.java
package com.zetcode;

import java.util.regex.Pattern;

public class CreditCardValidation {

    public static void main(String[] args) {
        
        String[] cards = {
            "4111-1111-1111-1111", // Visa
            "5500-0000-0000-0004", // MasterCard
            "3400-0000-0000-009",  // American Express
            "6011-0000-0000-0004", // Discover
            "1234-5678-9012-3456", // Invalid
            "4111111111111111"      // Visa no hyphens
        };
        
        String visaRegex = "^4[0-9]{12}(?:[0-9]{3})?$";
        String mastercardRegex = "^5[1-5][0-9]{14}$";
        String amexRegex = "^3[47][0-9]{13}$";
        String discoverRegex = "^6(?:011|5[0-9]{2})[0-9]{12}$";
        
        for (String card : cards) {
            // Remove hyphens for validation
            String cleanCard = card.replaceAll("-", "");
            
            boolean isValid = false;
            String cardType = "Unknown";
            
            if (Pattern.matches(visaRegex, cleanCard)) {
                isValid = true;
                cardType = "Visa";
            } else if (Pattern.matches(mastercardRegex, cleanCard)) {
                isValid = true;
                cardType = "MasterCard";
            } else if (Pattern.matches(amexRegex, cleanCard)) {
                isValid = true;
                cardType = "American Express";
            } else if (Pattern.matches(discoverRegex, cleanCard)) {
                isValid = true;
                cardType = "Discover";
            }
            
            System.out.printf("%-25s: %-16s %s%n", 
                card, cardType, isValid ? "Valid" : "Invalid");
        }
    }
}

该示例首先从卡号中删除连字符。 然后,它根据主要卡类型的模式检查每张卡。 这些模式验证起始数字和长度要求。 请注意,这不会验证 Luhn 校验和以供实际使用。

来源

Java Pattern.matches 文档

在本文中,我们通过七个实际示例探讨了 Pattern.matches 方法。 这些演示了常见的验证场景,其中正则表达式模式匹配在 Java 应用程序中很有用。

作者

我的名字是 Jan Bodnar,我是一位经验丰富的程序员。 我于 2007 年开始撰写编程文章,至今已撰写了 1,400 多篇文章和八本电子书。 凭借超过八年的教学经验,我致力于分享我的知识并帮助他人掌握编程概念。

列出所有Java教程