【问题标题】:How to capitalize each letter after a special letter in android?如何在android中的特殊字母后将每个字母大写?
【发布时间】:2014-12-01 16:40:09
【问题描述】:

首先,请不要将其标记为重复。

我有一个非常具体的问题。 我必须将每个单词的首字母大写。问题是我无法找出单词何时开始。

比如我给了String:

0nd0-cathay bank (federal saving)

输出应该如下:

0Nd0-Cathay Bank (Federal Saving).

目前我有以下标题案例的方法:

public static String toTitleCase(String str) 
{
    if (str == null) 
        return "";

    boolean space = true;
    StringBuilder builder = new StringBuilder(str);
    final int len = builder.length();

    for (int i=0; i < len; ++i) 
    {
        char c = builder.charAt(i);

        if (space) 
        {
            if (!Character.isWhitespace(c)) 
            {
                // Convert to title case and switch out of whitespace mode.
                builder.setCharAt(i, Character.toTitleCase(c));
                space = false;
            }
        } 
        else if (Character.isWhitespace(c)) 
        {
            space = true;
        } 
        else 
        {
            builder.setCharAt(i, Character.toLowerCase(c));
        }
    }

    return builder.toString();
}

谢谢大家。

【问题讨论】:

  • 不知道解决方法的请不要投反对票!
  • 投反对票的人可以发表评论...

标签: java android string capitalize


【解决方案1】:

您可以将以下解决方案与正则表达式一起使用(虽然不是最漂亮的)。

String input = "0nd0-cathay bank (federal saving)";
// case-sensitive Pattern:
//                              | group 1: first letter
//                              |      | group 2: any other character if applicable
//                              |      |    | word boundary
Pattern p = Pattern.compile("([a-z])(.*?)\\b");
// Pattern for all capital letters 
// Pattern p = Pattern.compile("([A-Z])(.*?)\\b");
// initializing StringBuffer for appending
StringBuffer sb = new StringBuffer();
Matcher m = p.matcher(input);
// iterating over matches
while (m.find()) {
   // appending replacement:
   //                      | 1st letter capitalized
   //                      |                        | concatenated with...
   //                      |                        |     | any other character
   //                      |                        |     | within word boundaries
   m.appendReplacement(sb, m.group(1).toUpperCase().concat(m.group(2)));
   // Replacement for all capital letters
   // m.appendReplacement(sb, m.group(1).concat(m.group(2).toLowerCase()));
}
// appending tail if any
m.appendTail(sb);
System.out.println(sb.toString());

输出

0Nd0-Cathay Bank (Federal Saving)

备注

  • 这会将所有单词中的第一个字母字符大写, 即使单词不以字母字符开头。
  • 例如,0nd0 变为 0Nd0
  • 如果您根本不想要这种边缘情况,请在 Pattern 前添加一个单词边界 (\\b)。

【讨论】:

  • 您的解决方案就是将整个字符串设为大写。
  • @HarishGodara 不。复制它并查​​看输出。它将所有单词的第一个字母大写。
  • @Mena 他也想要大写 N 的 0Nd0。
  • @Mena 你能仔细检查你的帖子吗,它给我的输出如下:'0Nd0-Cathay BAnk (Federal SAving)'
  • @HarishGodara 这很奇怪。为我提供了预期的结果。你确定你完全复制粘贴了吗?
【解决方案2】:

这可能对你有用:

public static void main(String[] args) {
    String s = "0nd0-cathay bank (federal saving)";
    Pattern p = Pattern.compile("(?<![a-z])([a-z])"); // negative look-behind. check if your char is not preceeded by another char.
    Matcher m = p.matcher(s);
    while (m.find()) {
        char val = m.group(1).toUpperCase().charAt(0);
        s = s.replaceFirst(m.group(1), String.valueOf(val));
    }
    System.out.println(s);
}

O/P:

0Nd0-Cathay Bank (Federal Saving)

【讨论】:

  • 如果我们有类似 0ND0-CATHAY BANK (FEDERAL SAVING) 的字符串,我们应该使用什么 Regex 并且输出应该是:0Nd0-Cathay Bank (Federal Saving)。我不知道Regex
猜你喜欢
  • 2016-03-12
  • 1970-01-01
  • 2012-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-15
  • 1970-01-01
  • 2013-02-04
相关资源
最近更新 更多