我尝试更改字符串,例如' 18 rue D' armenie'或者' 25 boulevard D' armes'在' 18 rue d' Armenie'或者' 25 boulevard d' Armes'。 如何String.replace这个变化?
我现在所做的是这样的:
WordUtils.capitalizeFully(street.trim()).replace(" D'", " d'");
我想添加第二个替换做这样的事情:
street.replace("'[a-zA-z]", "'[a-zA-Z]".toUpperCase());
谢谢。
答案 0 :(得分:2)
您可以使用以下代码替换您的代码:
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])
(除非这些是序列的字母,当你必须使用交替运算符时)。
答案 1 :(得分:0)
String name = "stackoverflow";
name = name.substring(0,1).toUpperCase() + name.substring(1).toLowerCase();
name
的值为"Stackoverflow"
答案 2 :(得分:0)
String s = "18 rue D'armenie";
Pattern p = Pattern.compile( "([A-Z])'" );
Matcher m = p.matcher( s );
StringBuffer sb = new StringBuffe`enter code here`r();
while (m.find()) {
m.appendReplacement(sb, m.group(1).toLowerCase());
}
m.appendTail(sb);
System.out.println(sb.toString()); // 18 rue d'armenie
以类似的方式,您可以制作“a”大写
答案 3 :(得分:0)
为什么会使它复杂化?您可以将多个分隔符字符传递给WordUtils.capitalizeFully()
因此,您的问题的解决方案变得如此简单:
WordUtils.capitalizeFully(street.trim(), '\'', ' ').replace(" D'", " d'");