奇妙な要件のように思えますが、解決策は次のとおりです。
/** matches non-ASCII upper-case letters */
private static final Pattern UPPER =
Pattern.compile("[\\p{javaUpperCase}&&[^\\p{Upper}]]+");
private static String lowerNonAscii(String str, Locale locale) {
StringBuilder buffer = new StringBuilder();
Matcher matcher = UPPER.matcher(str);
int start = 0;
while (matcher.find()) {
String nonMatch = str.substring(start, matcher.start());
String match = str.substring(matcher.start(), matcher.end())
.toLowerCase(locale);
buffer.append(nonMatch)
.append(match);
start = matcher.end();
}
String tail = str.substring(start, str.length());
return buffer.append(tail)
.toString();
}
public static void main(String[] args) {
String test = "CL\u00C9MENT";
System.out.println(test + " > " + lowerNonAscii(test, Locale.ENGLISH));
}
ご了承ください:
- 大文字と小文字はロケールなしでは意味がないため、ロケールを提供する必要があります
- 分解された分音符号の特別な処理はありません。つまり、文字とアクセントが分離している場合です
char
。