regionMatches()忽略大小写需设ignoreCase为true,使用五参数版本;toffset、ooffset≥0且len≥0,越界时返回false;相比substring().equalsIgnoreCase(),它零拷贝、无对象创建。

regionMatches() 忽略大小写的参数怎么设
关键就一个布尔参数:ignoreCase,传 true 即可。它不是额外方法,而是重载签名里的第一个参数——别漏掉它,否则默认是 false,白写。
常见错误是只调用 regionMatches(int toffset, String other, int ooffset, int len) 这个四参数版本,结果大小写敏感还查不出问题在哪。
正确姿势必须用五参数版本:regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len)
匹配起始位置和长度容易错哪几个地方
三个整型参数(toffset、ooffset、len)都要求不越界,但检查逻辑不同:
-
toffset和ooffset只需 ≥ 0,不要求 ≤ 字符串长度(因为还要加len判断) -
len必须 ≥ 0;若为 0,直接返回true(空范围恒等) - 实际校验发生在运行时:如果
toffset + len > this.length()或ooffset + len > other.length(),立刻返回false,不会抛异常
所以别手动减 1 或加 1 调整下标——Java 的 regionMatches() 是左闭右开区间语义,toffset 就是起始索引,len 就是要比的字符个数。
和 equalsIgnoreCase() / substring().equalsIgnoreCase() 比有什么区别
核心差异在「局部」和「零拷贝」:
-
equalsIgnoreCase()是全字符串比较,不能指定范围 -
substring().equalsIgnoreCase()看似能局部比,但会新建子字符串对象,触发内存分配和复制——对长字符串或高频调用场景有明显开销 -
regionMatches(true, ...)完全不创建新对象,逐字符直接读原char数组,堆压力小、GC 友好
例如在解析协议头、扫描日志行前缀、实现简易 tokenizer 时,用 regionMatches() 替代 substring() + equalsIgnoreCase() 是典型优化点。
实际用例:判断 HTTP 请求行是否以 GET 开头(忽略大小写)
假设 line = "GET /index.html HTTP/1.1",想快速确认动词是不是 GET:
boolean isGet = line.regionMatches(true, 0, "GET", 0, 3);
注意这里没用 "GET " 或 "GET\t"——因为 len = 3 严格比前三个字符,后续空白或 tab 不参与匹配,避免误判 "GETX" 这类非法动词。
如果要兼容动词后紧跟空格,得单独再 check line.charAt(3) 是否为空白字符,regionMatches() 本身不做边界外推断。
这个方法不处理 Unicode 大小写(比如德语 ß),只基于 Java 的 Character.toUpperCase()/toLowerCase() 规则,对 ASCII 场景足够稳,但国际化文本需谨慎。

















