更正法国地址的资本化。如何在regex / java中的某个char之后将字符串中的char更改为大写?

时间:2017-08-08 12:16:19

标签: java regex string replace replaceall

我尝试更改字符串,例如' 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());

谢谢。

4 个答案:

答案 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"

more example

答案 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'");