Java Matcher.matches() 方法
上次修改时间:2025 年 4 月 20 日
java.util.regex.Matcher 类的 matches 方法尝试将整个输入序列与模式匹配。如果整个输入序列与模式匹配,则返回 true,否则返回 false。
与寻找部分匹配的 find 方法不同,matches 要求整个输入都与模式匹配。此方法通常用于需要完整模式匹配的验证任务。
matches() 的基本用法
使用 matches 的最简单方法是使用已编译的模式和输入字符串。只有当整个字符串完全匹配正则表达式模式时,该方法才返回 true。
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 的一个常见用例是验证电子邮件地址。该方法确保整个输入符合电子邮件模式结构。
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 可以验证电话号码是否遵循特定的格式规则。这通过要求完全的模式匹配来确保一致的数据输入。
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,我们可以通过要求特定的字符组合来强制执行密码策略。此示例检查最低强度要求。
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) 格式的日期,同时也验证日期值。
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 模式。
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 校验以进行基本有效性检查。这结合了模式匹配和算法验证。
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 算法验证。
来源
在本教程中,我们通过实际示例探讨了 matches 方法。此方法对于 Java 应用程序中的完整模式匹配验证至关重要。
作者
列出所有Java教程。