Как скрывать "HelloWorld"
до "Hello World"
. Разделение должно происходить на основе букв верхнего регистра, но должно исключать первую букву.
P.S: мне известно использование String.split, а затем объединение. Просто хотелось узнать, есть ли лучший способ.
Ответ 1
String output = input.replaceAll("(\\p{Ll})(\\p{Lu})","$1 $2");
Это регулярное выражение ищет строчную букву, заглавную заглавную букву, и заменяет их первым, пробелом и последним (эффективно разделяя их пробелом). Он помещает каждую из них в группу захвата ()
, чтобы иметь возможность повторно использовать значения в заменяющей строке через обратные ссылки ($1
и $2
).
Чтобы найти буквы верхнего и нижнего регистра, он использует \p{Ll}
и \p{Lu}
(вместо [a-z]
и [a-z]
), поскольку он обрабатывает все буквы верхнего и нижнего регистра в стандарте Unicode, а не только в диапазон ASCII (это приятное объяснение Unicode в regexes в основном относится и к Java).
Ответ 2
Лучше субъективно. Это требует еще нескольких строк кода:
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
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
Ответ 4
Если вы не хотите использовать регулярные выражения, вы можете прокручивать символы в строке, добавляя их в строковый конструктор (и добавляя пробел в построитель строк, если вы сталкиваетесь с большой буквы, которая не первой):
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);
}
Ответ 5
псевдокод:
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;
}