ZetCode

Java String.matches 方法

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

Java 中的 String.matches 方法检查字符串是否与给定的正则表达式匹配。它提供了一种方便的方式来执行模式匹配,而无需显式创建 Pattern 和 Matcher 对象。

如果整个字符串与正则表达式模式匹配,则此方法返回 true,否则返回 false。它在内部使用 Pattern.matches 方法,每次调用时都会编译正则表达式。

String.matches 方法概述

matches 方法定义在 String 类中。它接受一个表示正则表达式模式的字符串参数。该方法返回一个布尔值,指示字符串是否与该模式匹配。

对于需要反复使用相同正则表达式的性能关键型应用程序,最好使用 Pattern.compile 编译一次模式。matches 方法非常适合一次性模式匹配任务。

基本字符串匹配

matches 最简单的用法是检查字符串是否符合模式。下面的示例演示了使用不同模式进行的基本匹配。请注意,整个字符串必须与该模式匹配,该方法才会返回 true。

BasicMatches.java
package com.zetcode;

public class BasicMatches {

    public static void main(String[] args) {
        String text = "Hello123";
        
        // Check if string contains only letters
        System.out.println("Only letters: " + text.matches("[A-Za-z]+"));
        
        // Check if string contains letters followed by digits
        System.out.println("Letters then digits: " + 
            text.matches("[A-Za-z]+\\d+"));
        
        // Check if string starts with 'Hello'
        System.out.println("Starts with Hello: " + 
            text.matches("Hello.*"));
    }
}

在此示例中,我们针对同一字符串测试了三种不同的模式。第一个模式仅检查字母,由于有数字而失败。第二个模式成功,因为它匹配字母后跟数字。第三个检查特定的前缀。

电子邮件验证

matches 的一个常见用途是验证电子邮件地址。虽然电子邮件验证可能很复杂,但此示例显示了一个基本模式,可以捕获大多数有效的电子邮件格式。该模式检查正确的结构和字符。

EmailValidation.java
package com.zetcode;

public class EmailValidation {

    public static void main(String[] args) {
        String emailRegex = "^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+$";
        
        String email1 = "user@example.com";
        String email2 = "invalid.email@";
        String email3 = "another.user@test.org";
        
        System.out.println(email1 + " valid: " + email1.matches(emailRegex));
        System.out.println(email2 + " valid: " + email2.matches(emailRegex));
        System.out.println(email3 + " valid: " + email3.matches(emailRegex));
    }
}

此示例演示了使用简化的正则表达式模式进行电子邮件验证。该模式检查 @ 符号之前的字母数字字符和之后的有效域。请注意,这是一个基本模式,可能无法捕获电子邮件地址中的所有边缘情况。

密码强度检查

matches 方法可以强制执行密码策略。此示例检查密码是否至少包含 8 个字符,包含大写字母、小写字母、数字和特殊字符。正则表达式使用正向预查来验证每个要求。

PasswordCheck.java
package com.zetcode;

public class PasswordCheck {

    public static void main(String[] args) {
        String passwordRegex = "^(?=.*[A-Z])(?=.*[a-z])(?=.*\\d)" +
                              "(?=.*[@#$%^&+=!])(?=\\S+$).{8,}$";
        
        String pass1 = "Weakpass1";
        String pass2 = "Strong@Pass123";
        String pass3 = "noSpecialChars123";
        
        System.out.println(pass1 + " valid: " + pass1.matches(passwordRegex));
        System.out.println(pass2 + " valid: " + pass2.matches(passwordRegex));
        System.out.println(pass3 + " valid: " + pass3.matches(passwordRegex));
    }
}

正则表达式模式使用正向预查来确保满足每个字符类型要求。(?=.*[A-Z]) 检查是否至少有一个大写字母,而 (?=\S+$) 确保没有空格。最后的 .{8,} 要求最少长度为 8 个字符。

日期格式验证

验证日期格式是 matches 的另一个实际应用。此示例检查 YYYY-MM-DD 格式的日期。该模式验证月份和日期的正确数字范围,同时允许可选的前导零。

DateValidation.java
package com.zetcode;

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])$";
        
        String date1 = "2023-05-15";
        String date2 = "1999-12-31";
        String date3 = "2023-13-01"; // Invalid month
        
        System.out.println(date1 + " valid: " + date1.matches(dateRegex));
        System.out.println(date2 + " valid: " + date2.matches(dateRegex));
        System.out.println(date3 + " valid: " + date3.matches(dateRegex));
    }
}

正则表达式模式 \d{4} 匹配年份的四个数字。月份部分 (0[1-9]|1[0-2]) 允许 01-12。日期部分 (0[1-9]|[12][0-9]|3[01]) 允许 01-31。请注意,这不会验证实际的日历日期(例如 2 月 30 日)。

电话号码验证

电话号码验证演示了如何处理不同的格式。此示例接受带有可选国家/地区代码和各种分隔符字符的号码。该模式足够灵活,可以匹配常见的电话号码格式。

PhoneValidation.java
package com.zetcode;

public class PhoneValidation {

    public static void main(String[] args) {
        String phoneRegex = "^(\\+\\d{1,3}[- ]?)?(\\(\\d{3}\\)|\\d{3})" +
                            "[- ]?\\d{3}[- ]?\\d{4}$";
        
        String phone1 = "+1 (123) 456-7890";
        String phone2 = "123-456-7890";
        String phone3 = "1234567890";
        String phone4 = "+44 123 456 7890";
        
        System.out.println(phone1 + " valid: " + phone1.matches(phoneRegex));
        System.out.println(phone2 + " valid: " + phone2.matches(phoneRegex));
        System.out.println(phone3 + " valid: " + phone3.matches(phoneRegex));
        System.out.println(phone4 + " valid: " + phone4.matches(phoneRegex));
    }
}

该模式以可选的国家/地区代码 (\+\d{1,3}) 开头。主号码可以在括号内或纯数字。数字组之间的分隔符可以是空格或连字符。正则表达式确保正确的数字计数,同时允许格式灵活性。

十六进制颜色代码验证

此示例验证 Web 开发中使用的十六进制颜色代码。该模式匹配 3 位和 6 位格式,带有可选的 # 前缀。通过包含大写和小写字母来处理大小写不敏感性。

ColorValidation.java
package com.zetcode;

public class ColorValidation {

    public static void main(String[] args) {
        String colorRegex = "^#?([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$";
        
        String color1 = "#a1b2c3";
        String color2 = "FF00FF";
        String color3 = "#abc";
        String color4 = "ZZZZZZ"; // Invalid
        
        System.out.println(color1 + " valid: " + color1.matches(colorRegex));
        System.out.println(color2 + " valid: " + color2.matches(colorRegex));
        System.out.println(color3 + " valid: " + color3.matches(colorRegex));
        System.out.println(color4 + " valid: " + color4.matches(colorRegex));
    }
}

模式 [A-Fa-f0-9]{6} 匹配六个十六进制数字。备选方案 [A-Fa-f0-9]{3} 匹配三个数字(简写符号)。# 是可选的。这涵盖了标准 Web 颜色代码,同时拒绝无效字符。

用户名验证

用户名验证通常会限制允许的字符和长度。此示例强制执行常见规则:4-20 个字符,以字母开头,并且仅包含字母、数字、下划线或连字符。

UsernameValidation.java
package com.zetcode;

public class UsernameValidation {

    public static void main(String[] args) {
        String userRegex = "^[A-Za-z][A-Za-z0-9_-]{3,19}$";
        
        String user1 = "john_doe123";
        String user2 = "admin";
        String user3 = "1invalid";
        String user4 = "thisusernameistoolongtobevalid";
        
        System.out.println(user1 + " valid: " + user1.matches(userRegex));
        System.out.println(user2 + " valid: " + user2.matches(userRegex));
        System.out.println(user3 + " valid: " + user3.matches(userRegex));
        System.out.println(user4 + " valid: " + user4.matches(userRegex));
    }
}

模式 ^[A-Za-z] 确保用户名以字母开头。[A-Za-z0-9_-]{3,19} 允许 3-19 个附加字符(总长度为 4-20)。该示例显示了有效和无效的情况,包括一个太长和一个以数字开头的情况。

来源

Java String.matches 文档

本教程涵盖了 Java 的 String.matches 方法的基本用法。从基本的模式匹配到复杂的验证,此方法提供了一种在字符串处理中使用正则表达式的直接方法。

作者

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

列出所有Java教程