如何在Java中将字符串中每个单词的首尾字母大写

5
如何使字符串中每个单词的首尾字母大写?
我这样做过 -
    String cap = "";
    for (int i = 0; i < sent.length() - 1; i++)
    {
        if (sent.charAt(i + 1) == ' ')
        {
            cap += Character.toUpperCase(sent.charAt(i)) + " " + Character.toUpperCase(sent.charAt(i + 2));
            i += 2;
        }
        else
            cap += sent.charAt(i);
    }
    cap += Character.toUpperCase(sent.charAt(sent.length() - 1));
    System.out.print (cap);

当第一个单词超过一个字符时,它不起作用。

请使用简单的函数,因为我是初学者。


你是如何读取这个 String 的?是从 System.in 中读取还是通过用户输入和提交等方式? - Hypnic Jerk
当然,如果你只在字符后面跟着一个空格转换字符,那么它是不起作用的。你需要在第一个字符(如果 i == 0)以及前一个字符也是空格时进行转换。在循环中检查这一点,并且不要在循环内自己增加 i(即没有 i += 2;)- 这将为您节省很多麻烦。 - Thomas
顺便提一下,你永远不应该使用 String +=。请查看 StringBuilder 的文档,它实际上是由 Java 编译器在内部使用的。 - Gray
5个回答

4

使用Apache Commons Lang非常容易实现:

    String testString = "this string is needed to be 1st and 2nd letter-uppercased for each word";

    testString = WordUtils.capitalize(testString);
    testString = StringUtils.reverse(testString);
    testString = WordUtils.capitalize(testString);
    testString = StringUtils.reverse(testString);
    System.out.println(testString);

需要将每个单词的第一个和第二个字母大写


1
非常有趣的方式 :) - davidxxx
只有一个缺点:如果您需要处理许多单词,那么迭代次数可能会比所需的多一些,从而产生一些额外开销。 - davidxxx
这是真的,但对于输入不太长的情况可能会有所帮助。 - Andremoniy

2
你应该使用空格作为字符分隔符将字符串拆分,然后对每个标记的第一个和最后一个字符应用toUpperCase()方法,并创建一个新的字符串作为结果。
非常简单的示例:
  String cap = "";
  String sent = "hello  world. again.";

  String[] token = sent.split("\\s+|\\.$");

  for (String currentToken : token){
      String firstChar = String.valueOf(Character.toUpperCase(currentToken.charAt(0)));
      String between = currentToken.substring(1, currentToken.length()-1);
      String LastChar = String.valueOf(Character.toUpperCase(currentToken.charAt(currentToken.length()-1)));
      if (!cap.equals("")){
        cap += " ";
      }
      cap += firstChar+between+LastChar; 
  }

当您需要进行多次字符串连接时,优先选择使用 StringBuilder 而非 String。
输出结果:HellO World. AgaiN

如果句子中有 .,会发生什么? - nafas
请注意,如果您有双重空格,则会出现异常,因为数组将包含零长度字符串,从而导致 currentToken.charAt(0) 出现异常。 - Thomas
@Thomas 通常我们期望两个单词之间有一个空格。如果不符合这个规范,String[] token = sent.split("\\s+"); 就可以解决问题。 - davidxxx
@davidxxx 可能更好地使用 \b 作为分隔符。 - nafas
这就是我想说的:多个空格和标点符号需要更复杂的表达式。例如,?!,等等怎么办?你也需要考虑到这些,比如像nafas建议的那样匹配单词边界。 - Thomas
@Thomas 我同意你的看法。但是正如我在回答中所指出的,这只是一个示例,以便了解处理方式,并不是完整全面的答案。事实上,OP甚至没有提到句子,只有字符串。我们甚至不知道单词或标点符号之间是否可以有多个空格。将正则表达式调整为匹配实际内容并不难。 - davidxxx

0

你的代码漏掉了第一个单词的第一个字母。我会将其视为特殊情况,即

cap = ""+Character.toUpperCase(sent.charAt(0));
for (int i = 1; i < sent.length() - 1; i++)
{
.....

当然,有更简单的方法来做你正在做的事情。

如果第一个单词只有一个字母,则这将无效。然后第二个单词的第一个字母不是大写的。 - antrep1234

0

基本上,您只需要迭代所有字符并替换它们,如果满足以下条件之一:

  • 它是第一个字符
  • 它是最后一个字符
  • 前一个字符是空格(或任何您想要的内容,例如标点符号-见下文)
  • 下一个字符是空格(或任何您想要的内容,例如标点符号-见下文)

如果出于性能和内存原因使用StringBuilder(不要在每次迭代中创建String,这样+=会执行),则可能如下所示:

StringBuilder sb = new StringBuilder( "some words    in a list   even with    longer    whitespace in between" );
for( int i = 0; i < sb.length(); i++ ) {
  if( i == 0 || //rule 1
      i == (sb.length() - 1 ) || //rule 2
      Character.isWhitespace( sb.charAt( i - 1 ) ) || //rule 3
      Character.isWhitespace( sb.charAt( i + 1 ) ) ) { //rule 4
    sb.setCharAt( i, Character.toUpperCase( sb.charAt( i ) ) );
  }
}

结果:在列表中的一些单词,即使之间有更长的空格

如果您还想检查其他规则(例如标点符号等),可以创建一个方法,调用该方法以检查所需属性的前一个和下一个字符。


0
String stringToSearch = "this string is needed to be first and last letter uppercased for each word";

    // First letter upper case using regex
Pattern firstLetterPtn = Pattern.compile("(\\b[a-z]{1})+");
Matcher m = firstLetterPtn.matcher(stringToSearch);
StringBuffer sb = new StringBuffer();
while(m.find()){
    m.appendReplacement(sb,m.group().toUpperCase()); 
}
m.appendTail(sb);
stringToSearch = sb.toString();
sb.setLength(0);

    // Last letter upper case using regex
Pattern LastLetterPtn = Pattern.compile("([a-z]{1}\\b)+");
m = LastLetterPtn.matcher(stringToSearch);
while(m.find()){
    m.appendReplacement(sb,m.group().toUpperCase()); 
}
m.appendTail(sb);
System.out.println(sb.toString());

output:

ThiS StrinG IS NeedeD TO BE FirsT AnD LasT LetteR UppercaseD FoR EacH WorD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接