技術と日常。

日々の気が付いたこと・気になったことを残しておきます。

[Java]文字列をreplaceAllで大文字/小文字化(\u, \l)する方法

文字列をreplaceAllで大文字/小文字化(\u, \l)する方法

そもそもPatternクラスで非対応

この記事にたどり着かれた方は、以下のように書いて「大文字小文字化しようとしたけれどできなかった!」という方も恐らく含まれているのではないかと思います。

// FOO barにしたいが……
"foo bar".replaceAll("(foo)", "\\u$1")

> Task :run
ufoo bar

これは、String#replaceAllにて内部的に呼び出されているPatternが、\u, \lに対応していないためです。

Perl 5との比較
Patternエンジンは、Perl 5と同じく、順序付けされた代替に対する従来のNFAベースのマッチングを実行します。

このクラスでサポートされていないPerl構文
...
プリプロセス演算\l \u、\L、および\U。

Pattern (Java SE 17 & JDK 17)

Java9以降なら解決策がある

Java9から、MatcherreplaceAll(Function<MatchResult,String> replacer)が追加されました。
こちらを使用することで、マッチした部分を大文字、小文字化することが可能です。

Pattern.compile("(foo)")
        .matcher("foo bar")
        .replaceAll(result -> result.group(1).toUpperCase());

> Task :run
FOO bar

参考

Use Java and RegEx to convert casing in a string - Stack Overflow