regionMatches() 提供高效安全的局部字符串比对,支持忽略大小写且不创建临时对象;需确保调用方和 other 非 null,len 非负,越界自动返回 false。
string.regionmatches() 提供了高效、安全的局部字符串比对能力,其中忽略大小写的校验可通过其重载方法直接实现,无需额外转成大写或小写,避免创建临时字符串对象,也规避了 nullpointerexception 风险(只要被比较的字符串非 null)。
使用带 ignoreCase 参数的 regionMatches 重载方法
Java 中最直接的方式是调用以下签名的方法:
public boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len)
参数说明:
-
ignoreCase:设为
true即启用忽略大小写比较 - toffset:当前字符串中开始比对的位置(从 0 开始)
- other:待比对的另一个字符串(不可为 null)
-
ooffset:
other字符串中开始比对的位置 -
len:要比较的字符数量(长度),超出任一字符串边界会自动返回
false
关键注意事项与安全实践
该方法内部已做边界检查,但需注意以下几点才能稳定使用:
- 调用方字符串(即
this)可为null吗?不可以 —— 会抛NullPointerException;建议先判空再调用 -
other参数也必须非 null,否则同样抛异常 -
len为负数时直接返回false;若toffset + len或ooffset + len超出各自字符串长度,也返回false,无需手动截断 - 忽略大小写基于平台默认 Locale,如需精确控制(例如土耳其语特殊规则),应改用
String.equalsIgnoreCase()或Collator,但 regionMatches 不支持自定义 Locale
实用示例:校验邮箱用户名是否以特定前缀不区分大小写开头
比如判断邮箱 "User123@domain.com" 的用户名部分(@ 前)是否以 "user" 开头:
String email = "User123@domain.com";
int atPos = email.indexOf('@');
if (atPos > 0) {
boolean startsWithUser = email.regionMatches(true, 0, "user", 0, 4);
// 返回 true,因为 "User" 和 "user" 前 4 字符忽略大小写一致
}
若想校验中间某段(如第 5~8 位是否等于 "ABCD",不区分大小写):
String s = "xyzAbCd123"; boolean match = s.regionMatches(true, 3, "abcd", 0, 4); // true
对比 toLowerCase() 方案的优势
常见错误做法是先调用 substring().toLowerCase().equals(...),问题在于:
- 创建新字符串对象,增加 GC 压力
- 若 substring 越界会抛
StringIndexOutOfBoundsException - 对非 ASCII 字符(如带有重音符号的字母)的 toLowerCase 行为可能受 Locale 影响,导致意外不匹配
-
regionMatches(true, ...)在底层逐字符比较,按 Unicode 标准做大小写映射,更轻量且行为更可预测

















