Как использовать первый символ каждого слова в строке

421

Есть ли встроенная в Java функция, которая использует первый символ каждого слова в строке и не влияет на остальные?

Примеры:

  • jon skeet -> Jon Skeet
  • miles o'Brien-> Miles O'Brien(B остается заглавной, это исключает заглавие)
  • old mcdonald-> Old Mcdonald*

* ( Old McDonaldбыло бы тоже найти, но я не ожидаю, что это будет слишком умным.)

Быстрый взгляд на документации Java Строка показывает только toUpperCase()и toLowerCase(), что, конечно , не дают желаемого поведения. Естественно, в результатах Google преобладают эти две функции. Это похоже на колесо, которое, должно быть, уже было изобретено, поэтому спрашивать не повредит, поэтому я смогу использовать его в будущем.

WillfulWizard
источник
18
Как насчет old mcdonald? Это должно стать Old McDonald?
Барт Киерс
2
Я не ожидаю, что функция будет такой умной. (Хотя, если у вас есть один, я был бы рад увидеть его.) Просто вверх первой буквы после пробела, но игнорировать остальные.
WillfulWizard
выпущен: stackoverflow.com/questions/1149855/…
Крис
1
В любом случае вы не сможете найти алгоритм, который должным образом обрабатывает заглавные буквы имен после факта ... до тех пор, пока есть пары имен, каждое из которых может быть правильным для данного человека, например, MacDonald и Macdonald, функция будет не знаю, что было правильно. Лучше сделать то, что вы сделали, хотя некоторые имена по-прежнему будут неверными (например, фон Нейман).
Дейв ДюПлантис
Попробуйте Бургер Кинг ...
Магно C

Ответы:

732

WordUtils.capitalize(str)(из Apache Commons-Text )

(Примечание: если вам нужно "fOO BAr"стать "Foo Bar", используйте capitalizeFully(..)вместо этого)

Bozho
источник
5
Я думаю, что вы имеете в виду WordUtils.capitalize (str). Смотрите API для деталей.
Ганс Догген
84
Сохраняя мою философию всегда голосуя за ответы, которые относятся к общим библиотекам.
Рави Валлау
11
Чтобы заменить не первую букву на слова в нижнем регистре, используйте capitalizeFully (str).
Умеш Раджбандари
5
Это решение действительно правильно ? это не по моему мнению! Если вы хотите использовать заглавную букву «LAMborghini», в конце концов вы хотите «Lamborghini». Так WordUtils.capitalizeFully(str)же и решение.
basZero
3
@BasZero - это правильный ответ на заданный вопрос. Я включу полную версию в качестве комментария.
Божо
229

Если вас беспокоит только то, что первая буква первого слова пишется с большой буквы:

private String capitalize(final String line) {
   return Character.toUpperCase(line.charAt(0)) + line.substring(1);
}
Ник Болтон
источник
3
это только меняет первую букву первого слова
Chrizzz
28
Действительно, это было мое намерение.
Ник Болтон
13
@nbolton - Но он явно игнорирует цель вопроса и терпит неудачу для тех случаев, которые приведены в этом примере, - и добавляет мало или вообще ничего к ранее приведенным ответам!
Дэвид Мангейм
17
Этот кусок кода небезопасен! Представьте, lineчто у вас нет значения или длина <2
stk
1
по-прежнему возвращайте Character.toUpperCase (word.charAt (0)) + word.substring (1) .toLowerCase ()
исключение
72

Следующий метод преобразует все буквы в верхний / нижний регистр, в зависимости от их положения рядом с пробелом или другими специальными символами.

public static String capitalizeString(String string) {
  char[] chars = string.toLowerCase().toCharArray();
  boolean found = false;
  for (int i = 0; i < chars.length; i++) {
    if (!found && Character.isLetter(chars[i])) {
      chars[i] = Character.toUpperCase(chars[i]);
      found = true;
    } else if (Character.isWhitespace(chars[i]) || chars[i]=='.' || chars[i]=='\'') { // You can add other chars here
      found = false;
    }
  }
  return String.valueOf(chars);
}
True Soft
источник
Я хотел бы улучшить и упростить условие цикла: if(Character.isLetter(chars[i])) { if(!found) { chars[i] = Character.toUpperCase(chars[i]); } found = true; } else { found = false; }.
Bancer
@bancer, с вашим примером вы не можете контролировать, за какими символами не будет следовать заглавная буква.
True Soft
@ TruSoft, я тебя не понимаю. Зачем вам нужно контролировать, какие символы следует после заглавной буквы? Как я понял, важно, чтобы предыдущий символ не был буквой, и мой пример это гарантирует. Просто замените ваш блок if-else-if на мой блок if-else и запустите тест.
Bancer
@TrueSoft, для ясности я бы переименовать foundв previousCharIsLetter.
Bancer
9
Мне нравится иметь ответы, которые не используют библиотеку общих ресурсов, потому что время от времени вы не можете использовать ее.
Хекман
39

Попробуйте этот очень простой способ

пример GivenString = "баран хороший мальчик"

public static String toTitleCase(String givenString) {
    String[] arr = givenString.split(" ");
    StringBuffer sb = new StringBuffer();

    for (int i = 0; i < arr.length; i++) {
        sb.append(Character.toUpperCase(arr[i].charAt(0)))
            .append(arr[i].substring(1)).append(" ");
    }          
    return sb.toString().trim();
}  

Выход будет: Ram Is Good Boy

Нилам Сингх
источник
1
этот код вызвал сбой нашего сервера: java.lang.StringIndexOutOfBoundsException: индекс строки вне диапазона: 0
Chrizzz
32
@Chrizzz, так что не передавайте код, который вы не тестировали ... Если вы предоставите пустую строку, произойдет сбой. Твоя вина, а не Нилам.
Райнхард
1
Если в конце есть пробел, то он падает, тогда я сначала добавил trim () и разделил строку пробелом. Это отлично сработало
Hanuman
Если кто-то ищет его версию Kotlin, вот она: stackoverflow.com/a/55390188/1708390
Ошибки происходят
16

Я написал небольшой класс, чтобы использовать все слова в строке.

Необязательно multiple delimiters, каждый со своим поведением (используйте заглавные буквы до, после или в обоих случаях для обработки подобных случаев O'Brian);

Необязательно Locale;

Есть не порывает с Surrogate Pairs.

LIVE DEMO

Вывод:

====================================
 SIMPLE USAGE
====================================
Source: cApItAlIzE this string after WHITE SPACES
Output: Capitalize This String After White Spaces

====================================
 SINGLE CUSTOM-DELIMITER USAGE
====================================
Source: capitalize this string ONLY before'and''after'''APEX
Output: Capitalize this string only beforE'AnD''AfteR'''Apex

====================================
 MULTIPLE CUSTOM-DELIMITER USAGE
====================================
Source: capitalize this string AFTER SPACES, BEFORE'APEX, and #AFTER AND BEFORE# NUMBER SIGN (#)
Output: Capitalize This String After Spaces, BeforE'apex, And #After And BeforE# Number Sign (#)

====================================
 SIMPLE USAGE WITH CUSTOM LOCALE
====================================
Source: Uniforming the first and last vowels (different kind of 'i's) of the Turkish word D[İ]YARBAK[I]R (DİYARBAKIR) 
Output: Uniforming The First And Last Vowels (different Kind Of 'i's) Of The Turkish Word D[i]yarbak[i]r (diyarbakir) 

====================================
 SIMPLE USAGE WITH A SURROGATE PAIR 
====================================
Source: ab 𐐂c de à
Output: Ab 𐐪c De À

Примечание: первая буква всегда будет заглавной (отредактируйте источник, если вы этого не хотите).

Пожалуйста, поделитесь своими комментариями и помогите мне найти ошибки или улучшить код ...

Код:

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;

public class WordsCapitalizer {

    public static String capitalizeEveryWord(String source) {
        return capitalizeEveryWord(source,null,null);
    }

    public static String capitalizeEveryWord(String source, Locale locale) {
        return capitalizeEveryWord(source,null,locale);
    }

    public static String capitalizeEveryWord(String source, List<Delimiter> delimiters, Locale locale) {
        char[] chars; 

        if (delimiters == null || delimiters.size() == 0)
            delimiters = getDefaultDelimiters();                

        // If Locale specified, i18n toLowerCase is executed, to handle specific behaviors (eg. Turkish dotted and dotless 'i')
        if (locale!=null)
            chars = source.toLowerCase(locale).toCharArray();
        else 
            chars = source.toLowerCase().toCharArray();

        // First charachter ALWAYS capitalized, if it is a Letter.
        if (chars.length>0 && Character.isLetter(chars[0]) && !isSurrogate(chars[0])){
            chars[0] = Character.toUpperCase(chars[0]);
        }

        for (int i = 0; i < chars.length; i++) {
            if (!isSurrogate(chars[i]) && !Character.isLetter(chars[i])) {
                // Current char is not a Letter; gonna check if it is a delimitrer.
                for (Delimiter delimiter : delimiters){
                    if (delimiter.getDelimiter()==chars[i]){
                        // Delimiter found, applying rules...                       
                        if (delimiter.capitalizeBefore() && i>0 
                            && Character.isLetter(chars[i-1]) && !isSurrogate(chars[i-1]))
                        {   // previous character is a Letter and I have to capitalize it
                            chars[i-1] = Character.toUpperCase(chars[i-1]);
                        }
                        if (delimiter.capitalizeAfter() && i<chars.length-1 
                            && Character.isLetter(chars[i+1]) && !isSurrogate(chars[i+1]))
                        {   // next character is a Letter and I have to capitalize it
                            chars[i+1] = Character.toUpperCase(chars[i+1]);
                        }
                        break;
                    }
                } 
            }
        }
        return String.valueOf(chars);
    }


    private static boolean isSurrogate(char chr){
        // Check if the current character is part of an UTF-16 Surrogate Pair.  
        // Note: not validating the pair, just used to bypass (any found part of) it.
        return (Character.isHighSurrogate(chr) || Character.isLowSurrogate(chr));
    }       

    private static List<Delimiter> getDefaultDelimiters(){
        // If no delimiter specified, "Capitalize after space" rule is set by default. 
        List<Delimiter> delimiters = new ArrayList<Delimiter>();
        delimiters.add(new Delimiter(Behavior.CAPITALIZE_AFTER_MARKER, ' '));
        return delimiters;
    } 

    public static class Delimiter {
        private Behavior behavior;
        private char delimiter;

        public Delimiter(Behavior behavior, char delimiter) {
            super();
            this.behavior = behavior;
            this.delimiter = delimiter;
        }

        public boolean capitalizeBefore(){
            return (behavior.equals(Behavior.CAPITALIZE_BEFORE_MARKER)
                    || behavior.equals(Behavior.CAPITALIZE_BEFORE_AND_AFTER_MARKER));
        }

        public boolean capitalizeAfter(){
            return (behavior.equals(Behavior.CAPITALIZE_AFTER_MARKER)
                    || behavior.equals(Behavior.CAPITALIZE_BEFORE_AND_AFTER_MARKER));
        }

        public char getDelimiter() {
            return delimiter;
        }
    }

    public static enum Behavior {
        CAPITALIZE_AFTER_MARKER(0),
        CAPITALIZE_BEFORE_MARKER(1),
        CAPITALIZE_BEFORE_AND_AFTER_MARKER(2);                      

        private int value;          

        private Behavior(int value) {
            this.value = value;
        }

        public int getValue() {
            return value;
        }           
    } 
Андреа Лигиос
источник
15
String toBeCapped = "i want this sentence capitalized";

String[] tokens = toBeCapped.split("\\s");
toBeCapped = "";

for(int i = 0; i < tokens.length; i++){
    char capLetter = Character.toUpperCase(tokens[i].charAt(0));
    toBeCapped +=  " " + capLetter + tokens[i].substring(1);
}
toBeCapped = toBeCapped.trim();
Рейд Мак
источник
1
Хммм, я думаю, что вторая строка в цикле должна выглядеть следующим образом: toBeCapped + = "" + capLetter + tokens [i] .substring (1, tokens [i] .length ());
jengelsma
1
Но это решение добавит пробел в начале. Так что вам может понадобиться сделать левую обрезку.
Камалаканнан Дж
13

Я сделал решение в Java 8, которое ИМХО более читабельно.

public String firstLetterCapitalWithSingleSpace(final String words) {
    return Stream.of(words.trim().split("\\s"))
    .filter(word -> word.length() > 0)
    .map(word -> word.substring(0, 1).toUpperCase() + word.substring(1))
    .collect(Collectors.joining(" "));
}

Суть этого решения можно найти здесь: https://gist.github.com/Hylke1982/166a792313c5e2df9d31

Hylke1982
источник
10

Использование org.apache.commons.lang.StringUtilsделает это очень просто.

capitalizeStr = StringUtils.capitalize(str);
Амир Барекет
источник
2
@Ash StringUtils.capitalise(str)устарела. См .: commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/…
Navigatron
Это делает заглавными только первый символ строки, а не первый символ каждого слова в строке. WordUtils устарела только потому, что она перешла от общего языка к общему
opticyclic
Не очень хорошая идея использовать внешнюю библиотеку для небольших задач.
Переполнение стека
7

С этим простым кодом :

String example="hello";

example=example.substring(0,1).toUpperCase()+example.substring(1, example.length());

System.out.println(example);

Результат: Привет

Адриан
источник
6
Что касается HELLO, он возвращает HELLO, но ожидал Hello, поэтому вы должны использовать toLowerCase () во второй подстроке
Trikaldarshi
5

Я использую следующую функцию. Я думаю, что это быстрее в производительности.

public static String capitalize(String text){
    String c = (text != null)? text.trim() : "";
    String[] words = c.split(" ");
    String result = "";
    for(String w : words){
        result += (w.length() > 1? w.substring(0, 1).toUpperCase(Locale.US) + w.substring(1, w.length()).toLowerCase(Locale.US) : w) + " ";
    }
    return result.trim();
}
Tassadar
источник
3
Всегда используйте StringBuilder при объединении, а не + =
chitgoks
2
Почему вы думаете, что это быстрее?
Питер Мортенсен
5

С Java 9+

Вы можете использовать String::replaceAllтак:

public static void upperCaseAllFirstCharacter(String text) {
    String regex = "\\b(.)(.*?)\\b";
    String result = Pattern.compile(regex).matcher(text).replaceAll(
            matche -> matche.group(1).toUpperCase() + matche.group(2)
    );

    System.out.println(result);
}

Пример :

upperCaseAllFirstCharacter("hello this is Just a test");

Выходы

Hello This Is Just A Test
YCF_L
источник
4

Используйте метод Split, чтобы разбить вашу строку на слова, затем используйте встроенные строковые функции, чтобы заглавные буквы в каждом слове, затем сложите вместе.

Псевдокод (ish)

string = "the sentence you want to apply caps to";
words = string.split(" ") 
string = ""
for(String w: words)

//This line is an easy way to capitalize a word
    word = word.toUpperCase().replace(word.substring(1), word.substring(1).toLowerCase())

    string += word

В конце строка выглядит примерно так: «Предложение, к которому вы хотите применить заглавные буквы»

Павел
источник
4

Это может быть полезно, если вам нужно использовать заглавные буквы. Он использует заглавные буквы для каждой подстроки " ", за исключением указанных строк, таких как "a"или "the". Я еще не запускал его, потому что уже поздно, должно быть все в порядке. Использует Apache Commons StringUtils.join()в одной точке. Вы можете заменить его простым циклом, если хотите.

private static String capitalize(String string) {
    if (string == null) return null;
    String[] wordArray = string.split(" "); // Split string to analyze word by word.
    int i = 0;
lowercase:
    for (String word : wordArray) {
        if (word != wordArray[0]) { // First word always in capital
            String [] lowercaseWords = {"a", "an", "as", "and", "although", "at", "because", "but", "by", "for", "in", "nor", "of", "on", "or", "so", "the", "to", "up", "yet"};
            for (String word2 : lowercaseWords) {
                if (word.equals(word2)) {
                    wordArray[i] = word;
                    i++;
                    continue lowercase;
                }
            }
        }
        char[] characterArray = word.toCharArray();
        characterArray[0] = Character.toTitleCase(characterArray[0]);
        wordArray[i] = new String(characterArray);
        i++;
    }
    return StringUtils.join(wordArray, " "); // Re-join string
}
Доминикас Мостаускис
источник
Разрывается, если в строке есть двойные пробелы, что глупо для ввода, но для справки.
JustTried
4
public static String toTitleCase(String word){
    return Character.toUpperCase(word.charAt(0)) + word.substring(1);
}

public static void main(String[] args){
    String phrase = "this is to be title cased";
    String[] splitPhrase = phrase.split(" ");
    String result = "";

    for(String word: splitPhrase){
        result += toTitleCase(word) + " ";
    }
    System.out.println(result.trim());
}
Taladork
источник
Добро пожаловать в переполнение стека! Как правило, ответы гораздо полезнее, если они включают в себя объяснение того, для чего предназначен код, и почему это решает проблему, не представляя других.
Нейрон
Самое простое
3
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));   

System.out.println("Enter the sentence : ");

try
{
    String str = br.readLine();
    char[] str1 = new char[str.length()];

    for(int i=0; i<str.length(); i++)
    {
        str1[i] = Character.toLowerCase(str.charAt(i));
    }

    str1[0] = Character.toUpperCase(str1[0]);
    for(int i=0;i<str.length();i++)
    {
        if(str1[i] == ' ')
        {                   
            str1[i+1] =  Character.toUpperCase(str1[i+1]);
        }
        System.out.print(str1[i]);
    }
}
catch(Exception e)
{
    System.err.println("Error: " + e.getMessage());
}
Suganya
источник
Это самый простой, простой и лучший ответ для новичка, как я!
abhishah901
3

Я решил добавить еще одно решение для заглавных слов в строке:

  • слова определяются здесь как соседние буквенные или цифровые символы;
  • предоставляются также суррогатные пары;
  • код был оптимизирован для производительности; а также
  • это все еще компактно.

Функция:

public static String capitalize(String string) {
  final int sl = string.length();
  final StringBuilder sb = new StringBuilder(sl);
  boolean lod = false;
  for(int s = 0; s < sl; s++) {
    final int cp = string.codePointAt(s);
    sb.appendCodePoint(lod ? Character.toLowerCase(cp) : Character.toUpperCase(cp));
    lod = Character.isLetterOrDigit(cp);
    if(!Character.isBmpCodePoint(cp)) s++;
  }
  return sb.toString();
}

Пример вызова:

System.out.println(capitalize("An à la carte StRiNg. Surrogate pairs: 𐐪𐐪."));

Результат:

An À La Carte String. Surrogate Pairs: 𐐂𐐪.
Кристиан Грюн
источник
3

Использование:

    String text = "jon skeet, miles o'brien, old mcdonald";

    Pattern pattern = Pattern.compile("\\b([a-z])([\\w]*)");
    Matcher matcher = pattern.matcher(text);
    StringBuffer buffer = new StringBuffer();
    while (matcher.find()) {
        matcher.appendReplacement(buffer, matcher.group(1).toUpperCase() + matcher.group(2));
    }
    String capitalized = matcher.appendTail(buffer).toString();
    System.out.println(capitalized);
curd0
источник
Прекрасно работает с toLowerCase -> "Matcher matcher = pattern.matcher (text.toLowerCase ());" (Для ввода текста, как "ДЖОН
ДОУ
3

Есть много способов преобразовать первую букву первого слова в заглавные. У меня есть идея. Это очень просто:

public String capitalize(String str){

     /* The first thing we do is remove whitespace from string */
     String c = str.replaceAll("\\s+", " ");
     String s = c.trim();
     String l = "";

     for(int i = 0; i < s.length(); i++){
          if(i == 0){                              /* Uppercase the first letter in strings */
              l += s.toUpperCase().charAt(i);
              i++;                                 /* To i = i + 1 because we don't need to add               
                                                    value i = 0 into string l */
          }

          l += s.charAt(i);

          if(s.charAt(i) == 32){                   /* If we meet whitespace (32 in ASCII Code is whitespace) */
              l += s.toUpperCase().charAt(i+1);    /* Uppercase the letter after whitespace */
              i++;                                 /* Yo i = i + 1 because we don't need to add
                                                   value whitespace into string l */
          }        
     }
     return l;
}
Phuoc Le
источник
Спасибо за попытку добавить ответ. Это разумная идея, но обратите внимание, что есть базовые функции, которые уже делают это, и код, который делает это подобно тому, что вы предоставили, и принятые ответы уже обрисовывают их в общих чертах очень четко.
Дэвид Мангейм
2
  package com.test;

 /**
   * @author Prasanth Pillai
   * @date 01-Feb-2012
   * @description : Below is the test class details
   * 
   * inputs a String from a user. Expect the String to contain spaces and    alphanumeric     characters only.
   * capitalizes all first letters of the words in the given String.
   * preserves all other characters (including spaces) in the String.
   * displays the result to the user.
   * 
   * Approach : I have followed a simple approach. However there are many string    utilities available 
   * for the same purpose. Example : WordUtils.capitalize(str) (from apache commons-lang)
   *
   */
  import java.io.BufferedReader;
  import java.io.IOException;
  import java.io.InputStreamReader;

  public class Test {

public static void main(String[] args) throws IOException{
    System.out.println("Input String :\n");
    InputStreamReader converter = new InputStreamReader(System.in);
    BufferedReader in = new BufferedReader(converter);
    String inputString = in.readLine();
    int length = inputString.length();
    StringBuffer newStr = new StringBuffer(0);
    int i = 0;
    int k = 0;
    /* This is a simple approach
     * step 1: scan through the input string
     * step 2: capitalize the first letter of each word in string
     * The integer k, is used as a value to determine whether the 
     * letter is the first letter in each word in the string.
     */

    while( i < length){
        if (Character.isLetter(inputString.charAt(i))){
            if ( k == 0){
            newStr = newStr.append(Character.toUpperCase(inputString.charAt(i)));
            k = 2;
            }//this else loop is to avoid repeatation of the first letter in output string 
            else {
            newStr = newStr.append(inputString.charAt(i));
            }
        } // for the letters which are not first letter, simply append to the output string. 
        else {
            newStr = newStr.append(inputString.charAt(i));
            k=0;
        }
        i+=1;           
    }
    System.out.println("new String ->"+newStr);
    }
}
Prasanth
источник
2

Вот простая функция

public static String capEachWord(String source){
    String result = "";
    String[] splitString = source.split(" ");
    for(String target : splitString){
        result += Character.toUpperCase(target.charAt(0))
                + target.substring(1) + " ";
    }
    return result.trim();
}
Химаншу Агравал
источник
1
Не используйте конкатенацию строк для создания длинных строк, это мучительно медленно: stackoverflow.com/questions/15177987/…
Лукас Кнут
2

Это просто еще один способ сделать это:

private String capitalize(String line)
{
    StringTokenizer token =new StringTokenizer(line);
    String CapLine="";
    while(token.hasMoreTokens())
    {
        String tok = token.nextToken().toString();
        CapLine += Character.toUpperCase(tok.charAt(0))+ tok.substring(1)+" ";        
    }
    return CapLine.substring(0,CapLine.length()-1);
}
Foobar
источник
2

Многоразовый метод для intiCap:

    public class YarlagaddaSireeshTest{

    public static void main(String[] args) {
        String FinalStringIs = "";
        String testNames = "sireesh yarlagadda test";
        String[] name = testNames.split("\\s");

        for(String nameIs :name){
            FinalStringIs += getIntiCapString(nameIs) + ",";
        }
        System.out.println("Final Result "+ FinalStringIs);
    }

    public static String getIntiCapString(String param) {
        if(param != null && param.length()>0){          
            char[] charArray = param.toCharArray(); 
            charArray[0] = Character.toUpperCase(charArray[0]); 
            return new String(charArray); 
        }
        else {
            return "";
        }
    }
}
Сириш Ярлагадда
источник
2

Вот мое решение.

Я столкнулся с этой проблемой сегодня вечером и решил обыскать ее. Я нашел ответ от Нилама Сингха, который был почти у цели, поэтому я решил исправить проблему (разбито на пустые строки) и вызвал сбой системы.

Метод, который вы ищете, назван capString(String s)ниже. Это превращает «Это только 5 утра здесь» в «Это только 5 утра здесь».

Код довольно хорошо прокомментирован, так что наслаждайтесь.

package com.lincolnwdaniel.interactivestory.model;

    public class StringS {

    /**
     * @param s is a string of any length, ideally only one word
     * @return a capitalized string.
     * only the first letter of the string is made to uppercase
     */
    public static String capSingleWord(String s) {
        if(s.isEmpty() || s.length()<2) {
            return Character.toUpperCase(s.charAt(0))+"";
        } 
        else {
            return Character.toUpperCase(s.charAt(0)) + s.substring(1);
        }
    }

    /**
     *
     * @param s is a string of any length
     * @return a title cased string.
     * All first letter of each word is made to uppercase
     */
    public static String capString(String s) {
        // Check if the string is empty, if it is, return it immediately
        if(s.isEmpty()){
            return s;
        }

        // Split string on space and create array of words
        String[] arr = s.split(" ");
        // Create a string buffer to hold the new capitalized string
        StringBuffer sb = new StringBuffer();

        // Check if the array is empty (would be caused by the passage of s as an empty string [i.g "" or " "],
        // If it is, return the original string immediately
        if( arr.length < 1 ){
            return s;
        }

        for (int i = 0; i < arr.length; i++) {
            sb.append(Character.toUpperCase(arr[i].charAt(0)))
                    .append(arr[i].substring(1)).append(" ");
        }
        return sb.toString().trim();
    }
}
lwdthe1
источник
2

1. Java 8 Streams

public static String capitalizeAll(String str) {
    if (str == null || str.isEmpty()) {
        return str;
    }

    return Arrays.stream(str.split("\\s+"))
            .map(t -> t.substring(0, 1).toUpperCase() + t.substring(1))
            .collect(Collectors.joining(" "));
}

Примеры:

System.out.println(capitalizeAll("jon skeet")); // Jon Skeet
System.out.println(capitalizeAll("miles o'Brien")); // Miles O'Brien
System.out.println(capitalizeAll("old mcdonald")); // Old Mcdonald
System.out.println(capitalizeAll(null)); // null

Для foo bARчтобы Foo Barзаменить map()метод с нижеследующим:

.map(t -> t.substring(0, 1).toUpperCase() + t.substring(1).toLowerCase())

2. String.replaceAll()(Java 9+)

ublic static String capitalizeAll(String str) {
    if (str == null || str.isEmpty()) {
        return str;
    }

    return Pattern.compile("\\b(.)(.*?)\\b")
            .matcher(str)
            .replaceAll(match -> match.group(1).toUpperCase() + match.group(2));
}

Примеры:

System.out.println(capitalizeAll("12 ways to learn java")); // 12 Ways To Learn Java
System.out.println(capitalizeAll("i am atta")); // I Am Atta
System.out.println(capitalizeAll(null)); // null

3. Apache Commons Text

System.out.println(WordUtils.capitalize("love is everywhere")); // Love Is Everywhere
System.out.println(WordUtils.capitalize("sky, sky, blue sky!")); // Sky, Sky, Blue Sky!
System.out.println(WordUtils.capitalize(null)); // null

Для заглавия:

System.out.println(WordUtils.capitalizeFully("fOO bAR")); // Foo Bar
System.out.println(WordUtils.capitalizeFully("sKy is BLUE!")); // Sky Is Blue!

Для получения подробной информации, ознакомьтесь с этим руководством .

attacomsian
источник
1

Для тех из вас, кто использует Velocity в MVC, вы можете использовать capitalizeFirstLetter()метод из класса StringUtils .

Сёго Яхаги
источник
1
String s="hi dude i                                 want apple";
    s = s.replaceAll("\\s+"," ");
    String[] split = s.split(" ");
    s="";
    for (int i = 0; i < split.length; i++) {
        split[i]=Character.toUpperCase(split[i].charAt(0))+split[i].substring(1);
        s+=split[i]+" ";
        System.out.println(split[i]);
    }
    System.out.println(s);
чувствую себя хорошо и программирование
источник
1
package corejava.string.intern;

import java.io.DataInputStream;

import java.util.ArrayList;

/*
 * wap to accept only 3 sentences and convert first character of each word into upper case
 */

public class Accept3Lines_FirstCharUppercase {

    static String line;
    static String words[];
    static ArrayList<String> list=new ArrayList<String>();

    /**
     * @param args
     */
    public static void main(String[] args) throws java.lang.Exception{

        DataInputStream read=new DataInputStream(System.in);
        System.out.println("Enter only three sentences");
        int i=0;
        while((line=read.readLine())!=null){
            method(line);       //main logic of the code
            if((i++)==2){
                break;
            }
        }
        display();
        System.out.println("\n End of the program");

    }

    /*
     * this will display all the elements in an array
     */
    public static void display(){
        for(String display:list){
            System.out.println(display);
        }
    }

    /*
     * this divide the line of string into words 
     * and first char of the each word is converted to upper case
     * and to an array list
     */
    public static void method(String lineParam){
        words=line.split("\\s");
        for(String s:words){
            String result=s.substring(0,1).toUpperCase()+s.substring(1);
            list.add(result);
        }
    }

}
Элиас Шейх
источник
1

Если вы предпочитаете гуаву ...

String myString = ...;

String capWords = Joiner.on(' ').join(Iterables.transform(Splitter.on(' ').omitEmptyStrings().split(myString), new Function<String, String>() {
    public String apply(String input) {
        return Character.toUpperCase(input.charAt(0)) + input.substring(1);
    }
}));
aaronvargas
источник
1
String toUpperCaseFirstLetterOnly(String str) {
    String[] words = str.split(" ");
    StringBuilder ret = new StringBuilder();
    for(int i = 0; i < words.length; i++) {
        ret.append(Character.toUpperCase(words[i].charAt(0)));
        ret.append(words[i].substring(1));
        if(i < words.length - 1) {
            ret.append(' ');
        }
    }
    return ret.toString();
}
Krunal
источник
1

Краткий и точный способ заключается в следующем:

String name = "test";

name = (name.length() != 0) ?name.toString().toLowerCase().substring(0,1).toUpperCase().concat(name.substring(1)): name;
--------------------
Output
--------------------
Test
T 
empty
--------------------

Он работает без ошибок, если вы попытаетесь изменить значение имени на три значения. Без ошибок.

Даниэль Аденью
источник
Что
делать,