Java String.matches 方法
上次修改时间:2025 年 4 月 20 日
Java 中的 String.matches 方法检查字符串是否与给定的正则表达式匹配。它提供了一种方便的方式来执行模式匹配,而无需显式创建 Pattern 和 Matcher 对象。
如果整个字符串与正则表达式模式匹配,则此方法返回 true,否则返回 false。它在内部使用 Pattern.matches 方法,每次调用时都会编译正则表达式。
String.matches 方法概述
matches 方法定义在 String 类中。它接受一个表示正则表达式模式的字符串参数。该方法返回一个布尔值,指示字符串是否与该模式匹配。
对于需要反复使用相同正则表达式的性能关键型应用程序,最好使用 Pattern.compile 编译一次模式。matches 方法非常适合一次性模式匹配任务。
基本字符串匹配
matches 最简单的用法是检查字符串是否符合模式。下面的示例演示了使用不同模式进行的基本匹配。请注意,整个字符串必须与该模式匹配,该方法才会返回 true。
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 的一个常见用途是验证电子邮件地址。虽然电子邮件验证可能很复杂,但此示例显示了一个基本模式,可以捕获大多数有效的电子邮件格式。该模式检查正确的结构和字符。
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 个字符,包含大写字母、小写字母、数字和特殊字符。正则表达式使用正向预查来验证每个要求。
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 格式的日期。该模式验证月份和日期的正确数字范围,同时允许可选的前导零。
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 日)。
电话号码验证
电话号码验证演示了如何处理不同的格式。此示例接受带有可选国家/地区代码和各种分隔符字符的号码。该模式足够灵活,可以匹配常见的电话号码格式。
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 位格式,带有可选的 # 前缀。通过包含大写和小写字母来处理大小写不敏感性。
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 个字符,以字母开头,并且仅包含字母、数字、下划线或连字符。
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教程。