Pull to refresh

Comments 41

интересно, почему так важно было использовать только ОДНУ строку?
str = org.apache.commons.lang.StringUtils.capitalize(str);
apache-commons это не стандартная библиотека. Читайте условие внимательнее!
Необходимость формировать такое в одну строку, может быть, например, для преобразования значений в отчетах Jasper (это было в нашем случае).
String strRes = strOrig.toUpperCase();

или я чего-то не понял?
не поняли) в данном случае ВСЕ буквы станут заглавными:
«СТРОКА С БОЛЬШИМ КОЛИЧЕСТВОМ СЛОВ»
Это «поднимет» только первый символ строки ;)
 String strRes = strOrig.replaceAll("\\b(\\S)", "$1");
Осталось толькл придумать, как из этого самого $1 получить строку, чтоб ее toUpperCase:)
Правдо это только для латиницы…
В правильном направлении движетесь, товарищ!

P.S. вышеуказанный риплейс сработает не только для латиницы…
Я тоже так думал
String s = «строка с большим количеством слов»;
String ss = s.replaceAll("(\\s)([а-я])", "$1>$2");
но модификатор > (знак больше) не работает, но суть такая
strRes = strOrig.replaceAll(
"\\b(\\w)",
"$1:" + strOrig.replaceAll("[^\\w]", "").toUpperCase() +":"
).replaceAll(
"\\b(\\w):.*(\\1).*:",
"$2"
);

Осталось во второй замене отключить соответствие регистра. Сделать это можно через Pattern и Matcher
Интересно, но мне почему-то показалось что под «ОДНИМ выражением» понимается вызовом одного метода один раз.
Одно присваивание — одно выражение…
Попробовал Ваш вариант — что-то не совсем работает…
Можете представить полность доработанный вариант?

PS: В нашем варианте используется не только комбинация replaceAll().
Ещё раз напоминаю, что речь идёт не об отдельном слове, а строке, содержащей НЕСКОЛЬКО слов. А Ваш пример даже не обработает случая строки, начинающейся с вайтспейса )
Сорри что лезу в чужой монастырь со своим PHP, но вот решение на нем:
$strRes = mb_ereg_replace("([a-zA-Zа-яА-Я])(\w*.*?)",'mb_strtoupper(\'\\1\')."\\2"',$strOrig,'e');

Думаю, в яве можно сделать аналогичным образом.
у меня в первую очередь возникло решение на perl, вида:
$str = ~s/\b(\w)/\U$1/g;
но увы в Джавовских регекспах нету препроцессинговых модификаторов…
Ага, тоже сразу подумал также:
$str=~s/\b\w/\U$&/g;

Решение на Java я смотрю аналогично.
пока думаю, мысль вслух: за Scala — будущее:
val strRes = strOrig split "\\b" filter {_.length > 0} map {x => x.charAt(0).toUpperCase + x.substring(1)} mkString
точнее даже strOrig split "\\b" map {_.capitalize} mkString
практически аналогично на groovy:
strOrig.split("\b").collect{it.toUpperCase()}.join()
В одно выражение:

String strRes = (new java.util.StringTokenizer(strOrig, " ", true) {
    public String toString() {
        StringBuilder sb = new StringBuilder();
        while (hasMoreTokens()) {
            String token = nextToken();
            sb.append (Character.toUpperCase(token.charAt(0)));
            sb.append (token.substring(1));
        }
        return sb.toString();
    }
}).toString();
не могу не согласиться. Это вполне заслуживающее уважения решение.
Но есть другое :)

PS: мы пробовали сделать так в первую очередь, но JasperReport не схвал это — в муках было рождено симпатичное решение без анонимных классов =)
PPS: один товарищ, у которого нету акка на хабре прислал абсолютно верное решение. Предлагаю еще немного подумать!
UFO just landed and posted this here
UFO just landed and posted this here
все ок. выражение оно и в Африке выражение) но, предлагаю подумать над альтернативным решением!
UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
String strRes = String.format(strOrig.replaceAll("\\b(\\S)", "%S"), (Object[]) strOrig.replaceAll("\\b(\\S)\\S*", "$1").split("\\s"));

>> .split("\\s")
-> .split("\\s+")

ещё надо что то сделать если в оригинальной строке есть символы '%' :D можно заменить на какой то заведомо не используемый, а потом обратно
UFO just landed and posted this here
UFO just landed and posted this here
именно так =) на мой взгляд интересное элегантное решение!
Я не силён в java, поэтому вот javascript:
("строка с большим количеством слов").replace(/(^.|\s.)/g, function(_0, _1) { return _1.toUpperCase();})
* strOrig.replace(/(^\S|\s+\S)/gm, function(_0, _1) { return _1.toUpperCase();}) (чего то со мной не то сегодня)
На пайтоне:
>>> a = «stroka s bolshim kolvom simvolov»
>>> " ".join([word[0].upper()+word[1:] for word in a.split(" ")])
'Stroka S Bolshim Kolvom Simvolov'
Возможно в жабке можно сделать что-то подобное
А почему так не попробовать?
String strRes = «Строка С Большим Количеством Слов»;
Sign up to leave a comment.

Articles