ZetCode

Java Matcher.matches() 方法

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

java.util.regex.Matcher 类的 matches 方法尝试将整个输入序列与模式匹配。如果整个输入序列与模式匹配,则返回 true,否则返回 false。

与寻找部分匹配的 find 方法不同,matches 要求整个输入都与模式匹配。此方法通常用于需要完整模式匹配的验证任务。

matches() 的基本用法

使用 matches 的最简单方法是使用已编译的模式和输入字符串。只有当整个字符串完全匹配正则表达式模式时,该方法才返回 true。

BasicMatch.java
package com.zetcode;

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class BasicMatch {

    public static void main(String[] args) {
        
        String input = "hello123";
        Pattern pattern = Pattern.compile("^[a-z]+\\d{3}$");
        Matcher matcher = pattern.matcher(input);
        
        boolean isMatch = matcher.matches();
        System.out.println("Does '" + input + "' match the pattern? " + isMatch);
        
        // Test another string
        input = "hello12";
        matcher = pattern.matcher(input);
        System.out.println("Does '" + input + "' match the pattern? " + matcher.matches());
    }
}

在这个例子中,我们创建了一个模式,它期望小写字母后跟三个数字。第一个测试字符串完全匹配此模式。第二个字符串失败,因为它末尾只有两个数字。

使用 matches() 进行电子邮件验证

matches 的一个常见用例是验证电子邮件地址。该方法确保整个输入符合电子邮件模式结构。

EmailValidation.java
package com.zetcode;

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class EmailValidation {

    public static void main(String[] args) {
        
        String emailRegex = "^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+$";
        Pattern pattern = Pattern.compile(emailRegex);
        
        String[] emails = {
            "user@example.com",
            "invalid.email",
            "another.user@test.org",
            "missing@dotcom"
        };
        
        for (String email : emails) {
            Matcher matcher = pattern.matcher(email);
            System.out.println(email + " is valid: " + matcher.matches());
        }
    }
}

此示例演示了使用 matches 进行电子邮件验证。正则表达式检查基本的电子邮件格式。只有从开始到结束完全匹配该模式的字符串才会返回 true。

电话号码格式

matches 可以验证电话号码是否遵循特定的格式规则。这通过要求完全的模式匹配来确保一致的数据输入。

PhoneNumberCheck.java
package com.zetcode;

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class PhoneNumberCheck {

    public static void main(String[] args) {
        
        String phoneRegex = "^\\(?\\d{3}\\)?[-.\\s]?\\d{3}[-.\\s]?\\d{4}$";
        Pattern pattern = Pattern.compile(phoneRegex);
        
        String[] phones = {
            "123-456-7890",
            "(123) 456-7890",
            "123.456.7890",
            "1234567890",
            "123-45-6789"
        };
        
        for (String phone : phones) {
            Matcher matcher = pattern.matcher(phone);
            System.out.println(phone + " is valid: " + matcher.matches());
        }
    }
}

该模式接受各种常见的电话号码格式。最后一个测试用例失败,因为它不匹配预期的 3-3-4 位数字分组模式。matches 确保整个字符串符合该格式。

密码强度检查

使用 matches,我们可以通过要求特定的字符组合来强制执行密码策略。此示例检查最低强度要求。

PasswordStrength.java
package com.zetcode;

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class PasswordStrength {

    public static void main(String[] args) {
        
        // At least 8 chars, one uppercase, one lowercase, one digit, one special
        String pwRegex = "^(?=.*[A-Z])(?=.*[a-z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]{8,}$";
        Pattern pattern = Pattern.compile(pwRegex);
        
        String[] passwords = {
            "StrongPass1!",
            "weakpass",
            "NoSpecialChar1",
            "short1!",
            "ALLUPPERCASE1!"
        };
        
        for (String pw : passwords) {
            Matcher matcher = pattern.matcher(pw);
            System.out.println(pw + " is strong: " + matcher.matches());
        }
    }
}

正则表达式使用正向预查来强制执行每个要求。只有第一个密码满足所有条件。matches 确保整个密码字符串符合所有规则。

日期格式验证

matches 非常适合验证日期格式。此示例检查 ISO 8601 (YYYY-MM-DD) 格式的日期,同时也验证日期值。

DateValidation.java
package com.zetcode;

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class DateValidation {

    public static void main(String[] args) {
        
        String dateRegex = "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$";
        Pattern pattern = Pattern.compile(dateRegex);
        
        String[] dates = {
            "2023-05-15",
            "2023-13-01",  // Invalid month
            "2023-02-30",  // Invalid day for February
            "15-05-2023",  // Wrong format
            "2023-05-15T12:00:00"  // Includes time
        };
        
        for (String date : dates) {
            Matcher matcher = pattern.matcher(date);
            System.out.println(date + " is valid: " + matcher.matches());
        }
    }
}

该模式验证结构,但不检查所有日历规则。只有第一个日期完全匹配该模式。请注意,这并不能验证所有可能的无效日期(例如 4 月 31 日)。

URL 验证

使用 matches 进行 URL 验证可确保字符串遵循正确的 URL 格式规则。此示例检查常见的 URL 模式。

UrlValidation.java
package com.zetcode;

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class UrlValidation {

    public static void main(String[] args) {
        
        String urlRegex = "^(https?|ftp)://[^\\s/$.?#].[^\\s]*$";
        Pattern pattern = Pattern.compile(urlRegex);
        
        String[] urls = {
            "http://example.com",
            "https://www.example.com/path",
            "ftp://files.example.com",
            "example.com",  // Missing protocol
            "http://example.com?query=test",
            "invalid url"
        };
        
        for (String url : urls) {
            Matcher matcher = pattern.matcher(url);
            System.out.println(url + " is valid: " + matcher.matches());
        }
    }
}

正则表达式检查所需的 URL 组件,如协议和域。只有从开始到结束匹配该模式的完整 URL 才会验证。该模式可以增强以满足更具体的要求。

信用卡号码验证

matches 可以验证信用卡号码格式,同时执行 Luhn 校验以进行基本有效性检查。这结合了模式匹配和算法验证。

CreditCardValidation.java
package com.zetcode;

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class CreditCardValidation {

    public static void main(String[] args) {
        
        // Visa, MasterCard, Amex, Discover patterns
        String ccRegex = "^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|" +
                         "3[47][0-9]{13}|6(?:011|5[0-9]{2})[0-9]{12})$";
        Pattern pattern = Pattern.compile(ccRegex);
        
        String[] cards = {
            "4111111111111111",  // Valid Visa
            "5500000000000004",  // Valid MasterCard
            "340000000000009",   // Valid Amex
            "1234567890123456",  // Invalid
            "6011000000000004",  // Valid Discover
            "378282246310005"    // Valid Amex
        };
        
        for (String card : cards) {
            Matcher matcher = pattern.matcher(card);
            System.out.println(card + " is valid format: " + matcher.matches());
        }
    }
}

此示例检查主要的信用卡模式。正则表达式验证格式,但不验证卡的实际有效性。对于生产环境,需要额外的 Luhn 算法验证。

来源

Java Matcher.matches() 文档

在本教程中,我们通过实际示例探讨了 matches 方法。此方法对于 Java 应用程序中的完整模式匹配验证至关重要。

作者

我叫 Jan Bodnar,是一位经验丰富的程序员,在该领域拥有多年经验。我从 2007 年开始撰写编程文章,此后撰写了 1,400 多篇文章和 8 本电子书。凭借超过八年的教学经验,我致力于分享我的知识,帮助他人掌握编程概念。

列出所有Java教程