【问题标题】:Capitalize first word of a sentence in a string with multiple sentences将包含多个句子的字符串中的句子的第一个单词大写
【发布时间】:2013-04-11 07:17:31
【问题描述】:

例如:

String s="this is a.line is .over"

应该是

“这是一个.Line is.Over”

我想过两次使用字符串标记器

-first split using"."

 -second split using " " to get the first word

 -then change charAt[0].toUpper

现在我不确定如何使用字符串标记器的输出作为另一个输入?

我也可以使用 split 方法生成我尝试过的数组

     String a="this is.a good boy";
     String [] dot=a.split("\\.");

       while(i<dot.length)
     {
         String [] sp=dot[i].split(" ");
            sp[0].charAt(0).toUpperCase();// what to do with this part?

【问题讨论】:

  • 你不需要第二次拆分来制作charAt[0].toUpper(),修剪就足够了。
  • 早点看到这个answer
  • @Bhaskar-这里的问题有点不同,我有一个包含多个句子的字符串,所以首先我想拆分句子,然后将单词大写。我的困惑是关于如何传递到第二个拆分
  • 任何答案有帮助吗?
  • @kshitij 在下面查看我的答案,让我知道它是否按您想要的方式工作。

标签: java string stringtokenizer


【解决方案1】:

请注意,Java 字符串是不可变的(不可修改)。

另请注意,如果. 后面有一个空格,sp[0].charAt(0) 将导致ArrayIndexOutOfBoundsException(此后第一个字符串将为空)。

我建议使用char[],比如:

 String a = "this is.a good boy";
 char arr[] = a.toCharArray();
 boolean capitalize = true;
 for (int i = 0; i < arr.length; i++)
   if (arr[i] == '.')
     capitalize = true;
   else if (arr[i] != ' ' && capitalize)
   {
     arr[i] = Character.toUpperCase(arr[i]);
     capitalize = false;
   }
 a = new String(arr);

Character.isWhitespace(arr[i]) 可能比arr[i] != ' ' 更受欢迎。

【讨论】:

  • 您需要将第一个字符添加为大写
  • @smttsp 字符串的第一个字符?它将是大写的,因为capitalizetrue 开头。
【解决方案2】:

使用StringBuilder,不需要拆分和创建其他字符串等等,看代码

public static void main(String... args) {

String text = "this is a.line is. over";

int pos = 0;
boolean capitalize = true;
StringBuilder sb = new StringBuilder(text);
while (pos < sb.length()) {
    if (sb.charAt(pos) == '.') {
        capitalize = true;
    } else if (capitalize && !Character.isWhitespace(sb.charAt(pos))) {
        sb.setCharAt(pos, Character.toUpperCase(sb.charAt(pos)));
        capitalize = false;
    }
    pos++;
}
System.out.println(sb.toString());
}

【讨论】:

  • 哇!那很干净!并省去了使用不同字符串的麻烦谢谢!
  • 我还需要提取“。”之后的第一个单词(空格除外)。我可以为此使用什么?
  • @kshitij 我很高兴你喜欢它。 “谢谢”在投票和选择作为答案时要好一些;)
  • @kshitij extract the first word 是一个单独的算法,与这个算法没有真正的关系。
  • 致未来的读者。如果需要定义所有类型的句子,将if大小写替换为sb.charAt(pos) == '.' || sb.charAt(pos) == '!' || sb.charAt(pos) == '?'
【解决方案3】:

试试这个把句子的第一个字母大写。我只是对你的代码做了一些改动。

public static void main(String[] args) {
    String a = "this is.a good boy";
    String[] dot = a.split("\\.");
    int i = 0;
    String output = "";
    while (i < dot.length) {
        dot[i] = String.valueOf(dot[i].charAt(0)).toUpperCase()
                + dot[i].substring(1);
        output = output + dot[i] + ".";
        i++;
    }
    System.out.println(output);
}

输出:

This is.A good boy.

【讨论】:

  • 谢谢!它工作得很好,但我担心多次转换可能会减慢更大数据的速度。
  • @kshitij 如果您使用 StringBuilder 而不是 String 作为输出变量,我认为这是最好的解决方案。
【解决方案4】:

不用再搞分裂和拼接了,你可以在字符数组上就地工作:

String s = "this is a.line is .over ";

char[] cs = s.toCharArray();

// make sure to capitalise the first letter in the string
capitaliseNextLetter(cs, 0);

for (int i = 0; i < cs.length; i++) {
    // look for a period
    if (cs[i] == '.') {
        // capitalise the first letter after the period
        i = capitaliseNextLetter(cs, i);
        // we're assigning to i to skip the characters that 
        // `capitaliseNextLetter()` already looked at.
    }
}

System.out.println(new String(cs));

// This will capitalise the first letter in the array `cs` found after 
// the index `i`
private static int capitaliseNextLetter(char[] cs, int i) {
    for (; i < cs.length; i++) {
        // This will skip any non-letter after the space. Adjust the test 
        // as desired
        if (Character.isAlphabetic(cs[i])) {
            cs[i] = Character.toUpperCase(cs[i]);
            return i;
        }
    }
    return cs.length;
}

【讨论】:

    【解决方案5】:

    如果您可以使用WordUtils from Apache commons-lang3,请执行以下操作:

    WordUtils.capitalizeFully(text, '.')
    

    【讨论】:

      【解决方案6】:
      char[] strArr = str.toCharArray();
              for (int i = 0; i < strArr.length; i++) {
                  if (str.charAt(i) == " ".charAt(0) && i + 1 < strArr.length) {
                      strArr[i + 1] = String.valueOf(String.valueOf(strArr[i + 1])).toUpperCase().charAt(0);
                  }
              }
              System.out.println(String.valueOf(strArr));
      

      【讨论】:

        猜你喜欢
        • 2021-07-05
        • 1970-01-01
        • 1970-01-01
        • 2011-07-20
        • 1970-01-01
        • 1970-01-01
        • 2013-04-04
        • 1970-01-01
        • 2021-01-13
        相关资源
        最近更新 更多