String output = input.replaceAll("(\p{Ll})(\p{Lu})","$1 $2");
This regex searches for a lowercase letter follwed by an uppercase letter and replaces them with the former, a space and the latter (effectively separating them with a space). It puts each of them in a capturing group ()
in order to be able to re-use the values in the replacement string via back references ($1
and $2
).
To find upper- and lowercase letters it uses p{Ll}
and p{Lu}
(instead of [a-z]
and [A-Z]
), because it handles all upper- and lowercase letters in the Unicode standard and not just the ones in the ASCII range (this nice explanation of Unicode in regexes mostly applies to Java as well).
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…