gpt4 book ai didi

java - 适用于 Latin-1 字符的不区分大小写的索引

转载 作者:太空宇宙 更新时间:2023-11-04 14:30:45 25 4
gpt4 key购买 nike

我正在寻找一种通过以下测试用例的方法:

 assertEquals(0, indexOfIgnoreCase("ss", "ß"));
assertEquals(0, indexOfIgnoreCase("ß", "ss"));
assertEquals(1, indexOfIgnoreCase("ßa", "a"));

有趣的字符(称为德语“sharp S”)并不是真正的异国情调(U+00DF,存在于 Latin-1 Suplement Unicode block 中),除非您将其大写:"ß".toUpperCase() 返回 "SS"(与区域设置无关)。

我寻找至少适用于前 256 个 Unicode 字符的解决方案,除了 ICU4j 之外什么也没返回,我不想使用它。

This question (间接)要求 String.contains 不区分大小写的版本,但请注意,大多数答案仅适用于 ASCII。接受的答案可以进行调整,例如

final int flags = Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE;
Pattern pattern = Pattern.compile(Pattern.quote(needle), flags);
final Matcher matcher = pattern.matcher(hay);
return matcher.find() ? matcher.start() : -1;

因此它也适用于非 ASCII 并返回位置而不是 boolean 值。然而,它未能通过上述测试。

Apache org.apache.commons.lang3.StringUtils 也没有通过。这个nice answer利用 String.regionMatches 提供了快速解决方案,但没有通过。

转换为小写是不够的,转换为大写就可以了,但最后一个测试用例将返回 2 而不是 1。

<小时/>

我有点不确定结果是什么

indexOfIgnoreCase("ßa", "sa")

应该是? 0.5 作为“针”从 ß 大写的第二个 S 开始?

最佳答案

  1. 将原始文本和needle转换为字符数组
  2. 将每个字符转换为大写
  3. 查找原始文本数组中的needle子数组位置。

例如:

char[] text = convertToUpperCase("...".toCharArray());
char[] needle = convertToUpperCase("...".toCharArray());

for (int i = 0; i < text.length - needle.length; i++)
if (arraysEqual(needle, 0, text, i, needle.length)) // The same signature as System.arraycopy
return i;

return -1;

关于java - 适用于 Latin-1 字符的不区分大小写的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26181647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com