Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:如何将字符串中每个单词的第一个字符大写,并正确地将名称大写_Java_String_Capitalization_Capitalize - Fatal编程技术网

Java:如何将字符串中每个单词的第一个字符大写,并正确地将名称大写

Java:如何将字符串中每个单词的第一个字符大写,并正确地将名称大写,java,string,capitalization,capitalize,Java,String,Capitalization,Capitalize,我正在寻找一种Java方法,它可以执行以下操作: 每个单词的字母都大写:“一个伟大的字符串”->“一个伟大的字符串” 名字的字母后面有一个大写撇号:“rick o'shea”->“rick o'shea” 为所有格添加的“s”不受影响:“一个bug的生活”->“一个bug的生活” 我尝试了一些方法,比如WordUtils.capitalize,但大多数都不满足2,其他的都不满足3 有没有一种有效的方法可以满足这三个条件 编辑:更多情况下,撇号后的字母不应大写 的 “好的 “不 “d “我 “是

我正在寻找一种Java方法,它可以执行以下操作:

  • 每个单词的字母都大写:
    “一个伟大的字符串”->“一个伟大的字符串”

  • 名字的字母后面有一个大写撇号:
    “rick o'shea”->“rick o'shea”

  • 为所有格添加的“s”不受影响:
    “一个bug的生活”->“一个bug的生活”

  • 我尝试了一些方法,比如
    WordUtils.capitalize
    ,但大多数都不满足2,其他的都不满足3

    有没有一种有效的方法可以满足这三个条件

    编辑:更多情况下,撇号后的字母不应大写

    • “好的
    • “不
    • “d
    • “我
    • “是吗

    然而,对于这个问题,我们可以集中讨论

    试试这个,我只接受了您介绍的测试用例,所以您可能希望添加到其中:

    public static void main(String[] args) {
        System.out.println(capitalize("a great string"));
        System.out.println(capitalize("rick o'shea"));
        System.out.println(capitalize("a bug's life"));
    }
    private static String capitalize(String str) {
        StringBuilder sb = new StringBuilder();
        for(String s : str.split(" ")) {
            if(Character.isLowerCase(s.charAt(0)))
                s = (char)(s.charAt(0)-32) + s.substring(1);
            int index = s.indexOf("'");
            if(index > -1 && (s.length() - index) > 2) {
                s = s.substring(0,index+1) + (char)(s.charAt(index+1)-32) + s.substring(index+2);
            }
            sb.append(s+" ");
        }
        String res = sb.toString();
        return res.substring(0, res.length()-1);
    }
    
    输出:

    A Great String 
    Rick O'Shea 
    A Bug's Life 
    

    如果有方法可以解决除3之外的所有问题,那么您可以使用它们并添加代码来逆转它们所做的任何错误。 我们只要在“Bug'S Life”中大写“'S”就可以了

    请注意,如果以所有格结尾,则需要在字符串末尾临时添加一个空格,但如果可以以所有格结尾,则应询问语言:D

    例如,简单的方法是

    String almost ="rick o'shea a bug's life".satisfy2(); 
    //At this point you have "Rick O'Shea A Bug'S Life"
    //Replacing possessive with small s (Notice the space here, so O'Shea won't be touched)
    String finished = almost.replace("'S ","'s ");
    

    如果还有其他类似的情况,大多数情况下都应该能够以相同的方式解决,还应该保持代码非常干净

    当在libs中找不到方法时,可以编写自己的方法。下面是一个使用正则表达式的解决方案:

    String capitalize(String s) {
        Matcher m = Pattern.compile("(\\w)(\\w*)").matcher(s);
        s = m.replaceAll(mr -> mr.group(1).toUpperCase() + mr.group(2).toLowerCase());
        m = Pattern.compile("'\\w\\b").matcher(s);
        return m.replaceAll(mr -> mr.group(0).toLowerCase());
    }
    

    据我所知,我不知道这样的图书馆。对于您的特殊需要,您需要提供一个名称+姓氏和模式匹配输入单词的词典。java如何知道大写哪个词呢?这可以由100行以下的自定义字符串实用程序classIs O'Shea处理,这是您希望看到的唯一“边缘大小写”?如果是这样,您可以显式地处理它。否则,请阅读。为什么您不能编写自己的方法?我忽略了这一点,很多名字都不遵循这些模式。例如,“Charles de Lint.”这可能会导致
    s
    字母从大写变为非大写。O'Shea将保留O'Shea,因为替换会在Bug之后有空格时替换,或者Bug的会导致Bug的,因为之后有空格