Разбивая строки на символы в верхнем регистре - PullRequest
3 голосов
/ 21 декабря 2010

Я делаю метод для чтения всего кода класса и делаю с ним что-то еще.

То, что я хочу сделать, это получить имя метода и создать строку с ним.

Что-то вроде removeProduct

Я сделаю строку "Удалить продукт"

Как я могу разделить метод name в прописных буквах? Как я могу построить эту новую строку с первой буквой каждого слова в качестве заглавной буквы? Я делаю это с подстрокой, есть ли более простой и лучший способ сделать это?

ps: я уверен, что мой бразильский английский не помог в названии. Если кто-то может сделать это выглядит лучше, я буду признателен.

Ответы [ 5 ]

6 голосов
/ 21 декабря 2010

Не надо изобретать велосипед, используйте метод в commons-lang

String input = "methodName";
String[] words = StringUtils.splitByCharacterTypeCamelCase(methodName);
String humanised = StringUtils.join(words, ' ');
4 голосов
/ 21 декабря 2010

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

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]) представляет собой утверждение нулевой ширины (положительный взгляд) , соответствующее позиции, где следующий символ находится между 'A' и 'Z'.

0 голосов
/ 21 декабря 2010

@ 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);
    }
}
0 голосов
/ 21 декабря 2010

Вы можете сделать это в 2 шага:

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);
}

Код в действии

0 голосов
/ 21 декабря 2010
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 ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...