【问题标题】:Breaking Strings into chars that are in upper case将字符串分解为大写字符
【发布时间】:2011-05-28 23:40:00
【问题描述】:

我正在制作一种方法来读取整个类代码并用它做一些事情。

我要做的是获取方法的名称,并用它制作一个字符串。

类似于 removeProduct 的东西

我将创建一个字符串“删除产品”

如何在大写情况下拆分名称方法? 如何使用每个单词的首字母大写来构建这个新字符串? 我是用子串做的,有没有更简单更好的方法呢?

ps:我确信我的巴西英语对标题没有帮助。如果有人能让它看起来更好,我将不胜感激。

【问题讨论】:

  • 你所有的方法都会遵循这个camelCaseStyle吗?
  • 是的,他们将使用 camelCaseStyle

标签: java string


【解决方案1】:

别再造轮子了,用commons-lang中的方法

String input = "methodName";
String[] words = StringUtils.splitByCharacterTypeCamelCase(methodName);
String humanised = StringUtils.join(words, ' ');

【讨论】:

    【解决方案2】:

    您可以使用正则表达式将名称拆分为各个单词,然后将第一个大写:

    public static void main(String[] args) {
        String input = "removeProduct";
    
        //split into words
        String[] words = input.split("(?=[A-Z])");
    
        words[0] = capitalizeFirstLetter(words[0]);
    
        //join
        StringBuilder builder = new StringBuilder();
        for ( String s : words ) {
            builder.append(s).append(" ");
        }
    
        System.out.println(builder.toString());
    
    }
    
    private static String capitalizeFirstLetter(String in) {
        return in.substring(0, 1).toUpperCase() + in.substring(1);
    }
    

    请注意,这需要更好的极端情况处理,例如不在末尾附加空格并处理 1 字符的单词。

    编辑:我的意思是解释正则表达式。正则表达式(?=[A-Z]) 是一个zero-width assertion (positive lookahead),匹配下一个字符在“A”和“Z”之间的位置。

    【讨论】:

      【解决方案3】:

      您可以分两步完成:

      1 - 使字符串的第一个字母大写。

      2 - 在大写字母前插入一个空格,前面是一个小写字母。

      第 1 步可以使用函数,第 2 步可以使用 String.replaceAll 方法:

      String str = "removeProduct";
      str = capitalizeFirst(str);
      str = str.replaceAll("(?<=[^A-Z])([A-Z])"," $1");
      
      static String capitalizeFirst(String input) {
            return input.substring(0, 1).toUpperCase() + input.substring(1);
      }
      

      Code In Action

      【讨论】:

        【解决方案4】:

        @MrWiggles 是对的。 只是另一种方法可以做到这一点而不花哨:)

        import java.util.StringTokenizer;
        
        public class StringUtil {
        
            public static String captilizeFirstLetter(String token) {
                return Character.toUpperCase(token.charAt(0)) + token.substring(1);
            }
        
            public static String convert(String str) {
                final StringTokenizer st = new StringTokenizer(str,
                        "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", true);
                final StringBuilder sb = new StringBuilder();
                String token;
                if (st.hasMoreTokens()) {
                    token = st.nextToken();
                    sb.append(StringUtil.captilizeFirstLetter(token) + " ");
                }
        
                while (st.hasMoreTokens()) {
                    token = st.nextToken();
                    if (st.hasMoreTokens()) {
                        token = token + st.nextToken();
                    }
        
                    sb.append(StringUtil.captilizeFirstLetter(token) + " ");
                }
                return sb.toString().trim();
            }
        
            public static void main(String[] args) throws Exception {
        
                String words = StringUtil.convert("helloWorldHowAreYou");
                System.out.println(words);
            }
        }
        

        【讨论】:

          【解决方案5】:
          public String convertMethodName(String methodName) {
              StringBuilder sb = new StringBuilder().append(Character.toUpperCase(methodName.charAt(0)));
              for (int i = 1; i < methodName.length(); i++) {
                  char c = methodName.charAt(i);
                  if (Character.isUpperCase(c)) {
                      sb.append(' ');
                  }
                  sb.append(c);
              }
              return sb.toString();
          }
          

          以这种方式处理它可能会给您一些更好的控制,以防您以后想在其他情况下添加功能(连续多个大写等)。基本上,对于每个字符,它只检查它是否在大写字母的范围内(字符代码 65-90,包括在内),如果是,则在单词开始之前在缓冲区中添加一个空格。

          编辑:使用 Character.isUpperCase()

          【讨论】:

          • 尝试使用Character.isUpperCase() 而不是c &gt;= 65...。如果您要进行直接比较,至少要进行c &gt;= 'A',以便清楚您在做什么。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-11-25
          • 1970-01-01
          • 1970-01-01
          • 2014-02-04
          • 2010-09-26
          • 1970-01-01
          相关资源
          最近更新 更多