您可以用下面的替换代码:
String s = "25 a-b boulevard d'armes Boulevard D'armes";
StringBuffer result = new StringBuffer();
Matcher m = Pattern.compile("\\b(D)(?=')|\\b(?<!-)\\p{L}(?!')").matcher(s); // Or "\\b(?:(D)(?=')|(?<!-)\\p{L}(?!'))" to make it a bit more efficient
while (m.find()) {
if (m.group(1) == null) {
m.appendReplacement(result, m.group(0).toUpperCase());
} else {
m.appendReplacement(result, m.group(1).toLowerCase());
}
}
m.appendTail(result);
System.out.println(result.toString());
// => 25 A-b Boulevard d'Armes Boulevard d'Armes
见Java online demo。
图案的详细资料
\\b
- 一个字边界
(D)
- 第1组:大写字母D
是...
(?=')
- 随后与'
|
- 或...
\\b
- 一个字边界
(?<!-)
- 这是不是前面有-
(不大写的复合词的部分)
\\p{L}
- 任何Unicode字母(你可以使用\\p{Ll}
只匹配小写的,顺便说一下)
(?!')
- 信件不应该跟在'
之后。
注意:如果你想为l'
为d'
,和类似相同的行为,您可以添加替代第1组:\\b(D|L)
,或者更好,\\b([DL])
(除非这些都是序列的字母,当你必须使用交替操作符)。
什么是预期的结果? –
@WiktorStribiżew在一个长字符串中,我将所有单词的第一个字母改为大写。只是在这种情况下,单词是“D'armes”,它应该是“d'Armes”,所以我试图在字符串上添加一个替换字符,只会做出这种改变。 – user3450862