Вставить пробел после заглавной буквы - PullRequest
20 голосов
/ 03 февраля 2011

Как преобразовать "HelloWorld" в "Hello World". Разделение должно производиться на основе букв в верхнем регистре, но должно исключать первую букву.

PS : я знаю об использовании String.split, а затем о комбинировании. Просто хотел узнать, есть ли лучший способ.

Ответы [ 5 ]

61 голосов
/ 03 февраля 2011
String output = input.replaceAll("(\\p{Ll})(\\p{Lu})","$1 $2");

Это регулярное выражение ищет строчную букву, за которой следует заглавная буква, и заменяет их на первую, пробел и последнюю (фактически разделяя их пробелом). Он помещает каждого из них в группу захвата (), чтобы можно было повторно использовать значения в строке замены через обратные ссылки ($1 и $2).

Для поиска заглавных и строчных букв используются \p{Ll} и \p{Lu} (вместо [a-z] и [A-Z]), поскольку он обрабатывает все заглавные и строчные буквы в стандарте Unicode. и не только в диапазоне ASCII ( это прекрасное объяснение Unicode в регулярных выражениях в основном относится и к Java).

5 голосов
/ 03 февраля 2011

Лучше субъективно.Это займет еще несколько строк кода:

public static String deCamelCasealize(String camelCasedString) {
    if (camelCasedString == null || camelCasedString.isEmpty())
        return camelCasedString;

    StringBuilder result = new StringBuilder();
    result.append(camelCasedString.charAt(0));
    for (int i = 1; i < camelCasedString.length(); i++) {
        if (Character.isUpperCase(camelCasedString.charAt(i)))
        result.append(" ");
        result.append(camelCasedString.charAt(i));
    }
    return result.toString();
}

Скрыть эту уродливую реализацию в служебном классе и использовать ее как API (выглядит нормально с точки зрения пользователя;))

3 голосов
/ 03 февраля 2011
    String s = "HelloWorldNishant";
    StringBuilder out = new StringBuilder(s);
    Pattern p = Pattern.compile("[A-Z]");
    Matcher m = p.matcher(s);
    int extraFeed = 0;
    while(m.find()){
        if(m.start()!=0){
            out = out.insert(m.start()+extraFeed, " ");
            extraFeed++;
        }
    }
    System.out.println(out);

печать

Hello World Nishant

1 голос
/ 03 февраля 2011

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

String s = "HelloWorld";
StringBuilder result = new StringBuilder();
for(int i=0 ; i<s.length() ; i++) {
    char c = s.charAt(i);
    if(i!=0&&Character.isUpperCase(c)) {
        result.append(' ');
    }
    result.append(c);
}
0 голосов
/ 03 февраля 2011

Псевдокод:

String source = ...;
String result = "";

// FIXME: check for enf-of-source

for each letter in source {
    while current letter not uppercase {
        push the letter to result;
        advance one letter;
    }
    if not the first letter {
        push space to result;
    }
    push the letter to result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...