【问题标题】:how to replace string in java?如何在java中替换字符串?
【发布时间】:2013-07-16 08:35:11
【问题描述】:

我有一个String str = "a_bcde_fghij_k"

我想把它改成"aBcdeFghijK"

如果有_ 字符,下一个字符将变为大写并删除_ 字符。

我该怎么做?

【问题讨论】:

  • @AdamArold:我根本看不出它是如何复制的。其中哪一部分涉及“下一个字母大写”?
  • 如果有两个下划线(如“__a”)会发生什么?
  • 你需要 Character.toUpperCase(char);命令

标签: java regex string


【解决方案1】:

我怀疑你只需要逐个字符地遍历这个字符,在你去的时候建立字符串。例如:

public static String underscoreToCapital(String text) {
    // This will be a bit bigger than necessary, but that shouldn't matter.
    StringBuilder builder = new StringBuilder(text.length());
    boolean capitalizeNext = false;
    for (int i = 0; i < text.length(); i++) {
        char c = text.charAt(i);
        if (c == '_') {
            capitalizeNext = true;
        } else {
            builder.append(capitalizeNext ? Character.toUpperCase(c) : c);
            capitalizeNext = false;
        }
    }
    return builder.toString();
}

【讨论】:

  • 我认为正则表达式提供了更简单的代码,但可能更慢。
  • 哦,顺便说一句,这是text.length() ;)
  • @m0skit0:已修复,谢谢。但我仍然更喜欢这个而不是正则表达式版本:)
  • @JonSkeet 好的,我明白了 :) 但是我学到了一个教训:当你回答 xD 时,不要再浪费我的时间写答案了!祝你有美好的一天! :)
  • @JonSkeet +10 upvotes 并接受......但这不起作用。有人试过这个吗?对于输入a_acde_fghij_k,它返回AaCDEfGHIJk,据我了解,这是错误的。这个capitalizeNext ? c : Character.toUpperCase(c) 看起来像是换了。
【解决方案2】:

单独的正则表达式无法做到这一点(可以这么说,没有“touppercase”运算符)。

但是Guava 有一个不错的小工具,叫做CaseFormat,它可以帮助你:

String result = CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, str)

这有效,即使'尽管您的输入不是 严格 UPPER_UNDERSCORE 格式,但 CaseFormat 这样宽松(如果您希望第一个字符也大写,请使用 @987654324 @ 代替)。

或者,如果您绝对想使用正则表达式,您可以使用Matcher.appendReplacement(JavaDoc 中有一个很好的示例):

public static final Pattern UNDERSCORE_FOLLOWED_BY_ANYTHING = Pattern
        .compile("_(.)");

public static String toUpperAfterUnderscore(String input) {
    Matcher m = UNDERSCORE_FOLLOWED_BY_ANYTHING.matcher(input);
    StringBuffer sb = new StringBuffer();
    while (m.find()) {
        m.appendReplacement(sb, m.group(1).toUpperCase());
    }
    m.appendTail(sb);
    return sb.toString();
}

【讨论】:

  • 不错的答案,有用的信息,但是嗯,外部库...+1 反正
  • @m0skit0: Guava 包含许多有用的小工具,它真的应该成为每个非平凡项目(以及相当多的琐碎项目)的依赖项。
【解决方案3】:

您也可以尝试拆分。

String str = "a_bcde_fghij_k"
String result[] = str.split("_");
String newstr = result[0];
for (int i=1;i<result.length;i++) {
     char first = Character.toUpperCase(result[i].charAt(0));
     newstr = newstr + first + result[i].substring(1);
}
System.out.println(newstr);

split() 采用正则表达式,如果你觉得这很重要。

【讨论】:

  • 这也使用String进行连接,它应该真正使用StringBuilder(或至少StringBuffer),它们是制造被操纵的。
【解决方案4】:

与我的方法略有不同,但效果很好..

  String str = "a_bcde_fghij_k";
  int count=0;
  String[] splitString = (str.split("_"));

  for (String string : splitString)
  {
    count++;        
    if(count>1)
    {
        char c= string.charAt(0);
        System.out.print(string.replace(c, Character.toUpperCase(c)));
    }
    else
        System.out.print(string);
  }

不是吗?

【讨论】:

    【解决方案5】:

    使用正则表达式没有直接的方法,但我认为使用正则表达式可以大大简化任务:

    public static String underscoreToCapital(final String input) {
        String ret = input;
        final Matcher m = Pattern.compile("_([a-z])").matcher(input);
        while (m.find()) {
            final String found = m.group();
            final String toUppercase = m.group(1);
            ret = ret.replaceAll(found, toUppercase.toUpperCase());
        }
        return ret;
    }
    

    【讨论】:

    • 我个人认为这并不简单。 (我撤回了我认为它不起作用的建议,但我仍然认为它不像只是迭代那么清楚。)
    • 输入:a_acde_fghij_k 输出:a_Acde_Fghij_K 这是你的意思吗?还对其进行了编辑以匹配问题,我保留了下划线...
    • @JonSkeet answer edit 使您的评论正确:) 再次编辑它,现在它可以正常工作了。
    • @JonSkeet 我确实认为它比遍历所有字符更具可读性和可维护性(可能是因为我习惯于使用正则表达式)。更短的代码也意味着更少的错误;)你关于它不起作用的评论绝对是正确的,感谢您的纠正。
    【解决方案6】:

    您可能需要检查此方法的执行情况,但这可能是另一个想法:

    public String replaceAndUpper(String word) {
        int charToRemove = word.indexOf("_");
        while (charToRemove != -1) {
            String part1 = word.substring(0, charToRemove);
            String part2 = word.substring(charToRemove + 1);
            char upperChar = Character.toUpperCase(part2.charAt(0));
            word = part1 + String.valueOf(upperChar) + part2.substring(1);
            charToRemove = word.indexOf("_");
        }
        return word;
    }
    

    【讨论】:

    • 您应该使用 StringBuilder/Buffer(用于构建结果),用于此类连接(提供更好的性能)
    • 是的,这可能是一个改进。顺便说一句,如果我没记错的话,“+”应该在内部转换为使用 StringBuilder。
    • 对子字符串的调用也太多了。使用String#charAt() 会更好。
    • @Enrichman You're wrong.
    • 那你怎么分?使用 charAt 我可以让字符删除/大写,但是我必须拆分并重建字符串。
    猜你喜欢
    • 2023-02-23
    • 2010-11-17
    • 2015-03-05
    • 1970-01-01
    • 2018-03-02
    • 2014-07-23
    • 2015-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多