如何大写字符串中每个单词的第一个字符

Wil*_*ard 401 java string lowercase capitalization uppercase

是否有一个内置于Java中的函数可以将String中每个单词的第一个字符大写,而不影响其他单词?

例子:

  • jon skeet - > Jon Skeet
  • miles o'Brien- > Miles O'Brien(B仍然是资本,这排除了标题案例)
  • old mcdonald- > Old Mcdonald*

*(Old McDonald也会发现,但我不认为它那么聪明.)

就让我们来看看在Java的String文档仅揭示toUpperCase()toLowerCase(),这当然不提供所需的行为.当然,谷歌的结果由这两个功能主导.它看起来像一个必须已经发明的轮子,所以它可以不会受到伤害,所以我可以在将来使用它.

Boz*_*zho 713

WordUtils.capitalize(str)(来自apache commons-text)

(注意:如果你需要"fOO BAr"成为"Foo Bar",那么请capitalizeFully(..)改用)

  • 保持我的哲学总是投票提到公共图书馆的答案. (79认同)
  • 要将非首字母更改为小写的单词,请使用capitalizeFully(str). (11认同)
  • 我认为你的意思是WordUtils.capitalize(str).有关详情,请参阅API. (5认同)
  • **这个解决方案是否真的正确**?它不在我看来!如果你想把"LAMborghini"大都化,你最终想要"兰博基尼".所以**`WordUtils.capitalizeFully(str)`**是解决方案. (5认同)
  • @BasZero这是问题的正确答案.我将包括完整版本作为评论. (3认同)
  • 请注意,WordUtils现已弃用,并且是Apache Commons Text库的一部分 - https://commons.apache.org/proper/commons-text/ (3认同)
  • 我猜它得到了很多赞成,因为它回答了标题。人们通常会寻找如何将单词大写并发现这很有用 (2认同)
  • 我认为这个库中的这些方法也应该采用Locale参数. (2认同)

Nic*_*ton 223

如果您只担心第一个单词的首字母大写:

private String capitalize(final String line) {
   return Character.toUpperCase(line.charAt(0)) + line.substring(1);
}
Run Code Online (Sandbox Code Playgroud)

  • 的确,这是我的意图. (25认同)
  • 这段代码不是崩溃安全的!想象一下`line`为null或长度<2. (16认同)
  • @nbolton - 但是它明确地忽略了问题的意图,并且对于那个例子中给出的案例失败了 - 而且它对先前给出的答案几乎没有增加或者没有增加! (13认同)
  • 这只会改变第一个单词的第一个字母 (3认同)
  • 解决方案无法解决问题! (3认同)
  • 仍然返回Character.toUpperCase(word.charAt(0)) + word.substring(1).toLowerCase() (2认同)

Tru*_*oft 65

以下方法将所有字母转换为大写/小写,具体取决于它们在空格或其他特殊字符附近的位置.

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);
}
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢有不使用​​公共库的答案,因为每隔一段时间你就无法使用它. (8认同)

Nee*_*ngh 36

试试这个非常简单的方法

例子givenString ="ram是好孩子"

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();
}  
Run Code Online (Sandbox Code Playgroud)

输出将是:Ram是好男孩

  • @Chrizzz所以不要提交你没有测试的代码...如果你提供一个空字符串,它确实会崩溃.你的错,不是尼拉姆的. (30认同)
  • 如果末尾有空格,那么它就会崩溃,然后我首先添加了trim()并用空格分割字符串。它工作得很好 (2认同)

And*_*ios 16

我写了一个小类来大写字符串中的所有单词.

可选的multiple delimiters,每个都有其行为(大写之前,之后或两者,以处理像这样的情况O'Brian);

可选Locale;

不要打破Surrogate Pairs.

现场演示

输出:

====================================
 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 À
Run Code Online (Sandbox Code Playgroud)

注意:首字母将始终大写(如果您不想要,请编辑源代码).

请分享您的意见,帮助我找到错误或改进代码......

码:

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;
        }           
    } 
Run Code Online (Sandbox Code Playgroud)


Rei*_*Mac 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();
Run Code Online (Sandbox Code Playgroud)

  • 但这个解决方案会在开头添加一个空格。所以你可能需要进行左侧修剪。 (2认同)

小智 12

我在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(" "));
}
Run Code Online (Sandbox Code Playgroud)

可以在此处找到此解决方案的要点:https://gist.github.com/Hylke1982/166a792313c5e2df9d31


Ami*_*ket 10

使用org.apache.commons.lang.StringUtils使它变得非常简单.

capitalizeStr = StringUtils.capitalize(str);
Run Code Online (Sandbox Code Playgroud)

  • @Ash `StringUtils.capitalise(str)` 已弃用。参见:https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/StringUtils.html#capitalise(java.lang.String) (2认同)

Adr*_*ian 6

使用这个简单的代码:

String example="hello";

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

System.out.println(example);
Run Code Online (Sandbox Code Playgroud)

结果:你好

  • 怎么样HELLO它返回HELLO但是期望你好,所以你应该在第二个SubString中使用toLowerCase() (6认同)

YCF*_*F_L 6

From Java 9+

you can use String::replaceAll like this :

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);
}
Run Code Online (Sandbox Code Playgroud)

Example :

upperCaseAllFirstCharacter("hello this is Just a test");
Run Code Online (Sandbox Code Playgroud)

Outputs

Hello This Is Just A Test
Run Code Online (Sandbox Code Playgroud)


att*_*ian 6

1.Java 8 流

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(" "));
}
Run Code Online (Sandbox Code Playgroud)

例子:

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
Run Code Online (Sandbox Code Playgroud)

对于foo bARto Foo Bar,将该map()方法替换为以下内容:

.map(t -> t.substring(0, 1).toUpperCase() + t.substring(1).toLowerCase())
Run Code Online (Sandbox Code Playgroud)

2. String.replaceAll()(J​​ava 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));
}
Run Code Online (Sandbox Code Playgroud)

例子:

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));
}
Run Code Online (Sandbox Code Playgroud)

3. Apache Commons 文本

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
Run Code Online (Sandbox Code Playgroud)

对于标题大小写:

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

有关详细信息,请查看本教程


小智 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();
}
Run Code Online (Sandbox Code Playgroud)

  • 连接时始终使用StringBuilder而不是+ = (3认同)
  • 您为什么认为它更快? (2认同)