[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。
Java9以降なら解決策がある
Java9から、Matcher
にreplaceAll(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